随笔分类 - 【数据结构 Data Structure】
1
摘要:思路: 【1】根据前序性质,每一颗子树的前序第一个节点永远是其根节点(后序也有类似性质,所以知道后序中序求前序是一个道理)。 【2】根据中序性质,在中序序列中,某节点之前的节点全在其左边,反之在其右边。 那么我们在前序序列中找到当前树根节点时,再在中序序列中找到树根节点的位置,那么知道中序序列中,在
阅读全文
摘要:题意:问有没有数对(i,j)(0x)是否出现,所以要逆序枚举。代码:#include #include #include #include #include #include #define Mod 1000000007#define lll __int64#define ll long longu...
阅读全文
摘要:题意:给一棵树,每次给u到v的路径上所有点加上一个值,最后输出每个点的权值(初始为0)解法:每次在u,v间加k时,只要让u,v点的权值加上k,u,v的LCA处减去k(因为LCA的子树中加了两个k),再在LCA的父亲(如果有的话)减k,免除对上面的影响。最后dfs一遍,ans[u] += ans[v]...
阅读全文
摘要:题意:有三种操作:1.新增一条边从y连向x,此前x没有父节点2.x接到一份文件,(文件标号逐次递增),然后将这份文件一路上溯,让所有上溯的节点都接到这份文件3.查询某个节点x是否接到过文件F解法:首先要知道一个性质,节点u在v的上溯路径上的话要满足: L[u]= R[v] (先进后出)先将所有的边都...
阅读全文
摘要:题意: 两个人比赛,给出比赛序列,如果为1,说明这场1赢,为2则2赢,假如谁先赢 t 盘谁就胜这一轮,谁先赢 s 轮则赢得整个比赛。求有多少种 t 和 s 的分配方案并输出t,s。解法: 因为要知道有哪些t,s,那么我们至少要枚举一个量,然后才能得出所有分配方案,由题意似乎枚举 t 比较方便。由于 ...
阅读全文
摘要:题意:让你维护一个集合,有8种操作:1. I x 插入一个数2. R x 删除x3. S 输出总的数个数(集合大小)4. L x 查询小于x的数的个数5. W k 查询集合中数从小到大排列的第k个数6. C x 查询x的个数7. MI 查询集合中最小的数8. MA 查询集合中最大的数一道平衡树模拟的...
阅读全文
摘要:题意: n种食物,每种含花椒的概率为Pi,现在已经选择了[L,R]这个区间(下标)的食物,要再选一个,使总的食物只有一种含花椒的概率最大,问选哪个最好,相同的选下标小的。解法: 就不写解法了。此处有官方题解:http://acm.uestc.edu.cn/bbs/read.php?tid=5835维...
阅读全文
摘要:题意:给你n-1条边,然后没两个节点的距离按照递增的顺序,求出前k项的和。官方题解:把所有边(u,v) 以及(v,u)放入一个队列,队列每弹出一个元素(u,v),对于所有与u相邻的点w,如果w!=v,就把(w,u)入队。这样就能一个一个生成前K小的距离。 注意到每条边实际上会入队两次,只要把K翻倍且...
阅读全文
摘要:题意: 给出一些名字,名字间有父子关系,有三种操作:1.按祖先到后代,兄弟间按字典序由小到大排序,然后输出2.求某个节点的兄弟节点有多少个,包括自己(注意,根节点的兄弟节点是1)3.求节点a和b的公共祖先 (注意:如果公共祖先是a或b,必须要输出其父亲,与传统的LCA可以是自己不同)解法: 先把整棵...
阅读全文
摘要:题意: 有n*m个格子(n,m #include #include #include #include #include #include #include using namespace std;#define N 100007int nowR[N],R[N],b[N];map mp,CntC,n...
阅读全文
摘要:题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2.解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的线段树,所以没跳出来。后来熟悉了一下,原来很多细节地方都没有考虑到。这里build,update,qu...
阅读全文
摘要:题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值。解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数。那么每次查询[L,R]之间两数gcd的最大值即为查询[L,R]中值最大的线段,离线所有的查询数据,然后...
阅读全文
摘要:题意:给一些建筑物,x表示横坐标,h表示高度,然后查询某些坐标x,问从该点看向天空的最大张角是多大。解法:离线操作,读入所有数据,然后按x升序排序,对每一个查询的x,先从左到右,依次添加x坐标小于x的建筑物,加入一个建筑物的条件:1.此建筑物高度大于栈中的前一个,这个必然是最优的。2.加入这个建筑物...
阅读全文
摘要:题意:给你一些区间操作,让你输出最后得出的区间。解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题。线段树维护两个值: cov 和 rev ,一个是覆盖标记,0表示此区间被0覆盖,1表示被1覆盖,-1表示未被覆盖, rev为反转标...
阅读全文
摘要:题意:给n个矩形,求矩形周长并解法:跟求矩形面积并差不多,不过线段树节点记录的为:len: 此区间线段长度cover: 此区间是否被整个覆盖lmark,rmark: 此区间左右端点是否被覆盖num: 此区间分离开的线段的条数重点在转移的地方,不难理解。代码:#include #include #in...
阅读全文
摘要:题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和。解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt].len[i]表示覆盖次数大于等于i的线段长度,以便求面积,最后只要每次都用tree[1].len[K...
阅读全文
摘要:题意:给出矩形两对角点坐标,求矩形面积并。解法:线段树+离散化。每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线段树维护两个值:cover和len,cover表示该线段区间目前被覆盖的线段数目,len表示当前已覆盖的...
阅读全文
摘要:题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑。问最后最长的白色区间的起点和终点的位置。解法:先离散化,为了防止离散后错误,不仅将L,R离散,还要加入L+1,L-1,R+1,R-1一起离散,这样就绝不会有...
阅读全文
摘要:什么是离散化? ----Matrix67如果说今年这时候OIBH问得最多的问题是二分图,那么去年这时候问得最多的算是离散化了。对于“什么是离散化”,搜索帖子你会发现有各种说法,比如“排序后处理”、“对坐标的近似处理”等等。哪个是对的呢?哪个都对。关键在于,这需要一些例子和不少的讲解才能完...
阅读全文
摘要:题意:给出n条y=ai*x+bi的直线。对于这些直线,如果存在x使得该直线y大于其他任意一直线,那么这条直线可以被看见,问有多少条直线可以被看见。做法什么的不讲了,参见:http://blog.csdn.net/ten_three/article/details/12289427 以及 http:/...
阅读全文
1


浙公网安备 33010602011771号