dfs序和树链剖分
Roll_Keyboard
这个作者很懒,什么都没留下…
展开
-
SPOJ QTREE Query on a tree(树链剖分)
题意:给你一棵树,然后查询点u到v之间的最大值,并且中途可能会修改某个边的值思路:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html ↑这里树剖讲的很好 树剖基本题,没什么坑点但是写的时候,对于点的上下关系经常判断错,导致wa了一上午。树剖整体思路就是将树的边进行划分,最终达到类似倍增那样的不断跳跃来节省时间,同时把树按边转化为线性,这样就能原创 2018-01-25 15:26:30 · 219 阅读 · 0 评论 -
SPOJ QTREE3 Query on a tree again!(树链剖分)
题意:一颗树上,每个节点只有黑和白两种状态,最初都是白,现在有两种操作,一种问[1,x]中离1最近的黑节点编号,另一种把x节点取反思路:有点巧妙的树链剖分 我们知道,树链剖分是从根向下进行标号的,那么我们就可以以1作为根,这样我们在向上爬的过程中,每次从线段树中拿到的标号必然是最优的(线段树优先向左,这一点和我们在树链剖分里面的标记方式正好吻合),这样我们不断更新ans即可错误及反思:我在代码里面原创 2018-04-20 22:17:41 · 174 阅读 · 0 评论 -
HDU 5614 Baby Ming and Matrix tree (树链剖分)
题意:一颗树上,树上每个点是一个2×2的01矩阵(每个矩阵有两个1和两个0),可以顺时针旋转这个矩阵旧时度(代价2),或者直接替换(代价10),每次给你一个v,u和一个矩阵,问v到u的路上的矩阵全部变成刚给的矩阵的最小代价思路:树链剖分,因为1有两个,所以只有6种矩阵(其中又可以分成两组,每组中的矩阵可以相互转换),那么我们把矩阵手动手动标号,算出转换最小代价,然后用6棵线段树暴力查询,每次查询的时原创 2018-04-27 16:50:55 · 175 阅读 · 0 评论 -
Codeforces Round #336 (Div. 1) D. Power Tree(dfs序线段树)
题意:思路: 首先,直接模拟很不现实,只能先离线,造出空树,再慢慢更新树 那么现在想一下怎么维护这颗树,首先,我们算每个点对根节点的贡献,发现每个点的贡献可以表示为vi∗sz1∗sz2∗...∗v_i*sz_1*sz_2*...*(其中sz1,sz2是这个点和根节点的路径上的点,这些点的直接儿子),只要我们新加入一个节点,假设父亲的直接儿子节点个数为sz,那么这次修改就是把它父亲原创 2018-05-08 19:31:26 · 270 阅读 · 0 评论 -
spoj Qtree6/bzoj 3637 Query on a tree VI(树链剖分+线段树/LCT)
题意:思路:首先,我们要开两颗线段树,一颗表示,当前节点为白时,和子树所组成的最大联通块大小是多少,另一颗表示,当前节点为黑时,和子树所组成的最大联通块大小是多少。 那么我们查询点u的答案的时候,就向上找到最远的相同颜色的点v,点v所保存的答案就是u的答案(我们v为最远同色祖先)。 更新某个点u的颜色的时候,就是把u的父亲和最远同色祖先的父亲,这一条路径上的都更新(注意,黑白各更新...原创 2018-06-03 00:29:26 · 266 阅读 · 0 评论 -
hdu 5111 Alexandra and Two Trees (主席树+树剖)
题意:给你两颗树,q次查询,每次查询,问你第一颗树u1到v1,第二棵树u2到v2上,出现的数字交集大小,每颗树上不会有重复数字思路: 我们首先先想这样一个问题,给你两个数列a1,a2,a3...ana1,a2,a3...ana_1,a_2,a_3...a_n和b1,b2,b3,...bmb1,b2,b3,...bmb_1,b_2,b_...原创 2018-06-11 16:13:48 · 239 阅读 · 0 评论 -
spoj PT07J Query on a tree III (主席树+dfs序)
题意:一棵树,每次查询某个子树的第k大思路: 询问子树的问题,因为子树的dfs序是连续的一个区间,所以我们将这棵树dfs地建立主席树,查询子树就是查询子树对应的区间,这样就把树变成数列了错误及反思: 其实很简单,但是spoj卡常啊,在优化了常数,vector变成链式前向星,用了快读,...原创 2018-06-12 20:40:05 · 198 阅读 · 0 评论 -
NEERC 17 L Laminar Family (树链剖分)
题意: 给你一颗树,每次选取一个路径,把路径上的所有点加入到一个集合里面,问最后的集合是否两两之间满足 A∈BA∈B A\in B 或者B∈AB∈AB\in A或者A∪B=∅A∪B=∅A\cup B = \emptyset思路: 我们发现,如果最后是符合条件的,那么必定是一个集合被另一个集合...原创 2018-07-12 08:19:11 · 396 阅读 · 0 评论 -
bzoj 1103 大都市meg (dfs序+线段树)
题意: 一颗树,每条边权是1,两种操作,一种查询x到根的距离,一种把某边改为0思路: 对于一个边变了,那么影响的就是子树,所以dfs序+线段树就行了,这题对于时间要求很低,vector存边,每次暴力找答案也能A错误及反思:代码:...原创 2018-07-20 14:13:51 · 318 阅读 · 0 评论 -
HDU 5274 Dylans loves tree (树链剖分)
题意:一棵树,每个点有权,两种操作,一种单点修改,一种问x,y上的路有没有出现奇数次的点,并输出权值思路:因为异或了偶数次就还是0,所以树链剖分以后,每次询问的时候把所有的值异或起来就行了,因为数据还很小,所以我们单次直接更新到底就行了错误及反思:一开始没看到权值能为0,权值为0的时候我们手动加以下就可以了代码:#include<bits/stdc++.h>#define lson l,m,rt<原创 2018-04-20 16:54:50 · 191 阅读 · 0 评论 -
bzoj 3626 LCA (树链剖分)
题意:思路:比较有意思的树链剖分 首先对于两个点lca的深度,我们发现就是两点和根的连线的重叠部分,那么我们就可以先把一个点到根的所有点都染下色,再用另一个点去查看到根有几个点被染色了 然后想怎么处理那么多区间,根据之前说的,我们可以把[l,r]中所有的点都看作第一个点,z看作第二个点,这样我们离线了提问,然后一边把点放进去一边查询即可错误及反思:l是可以为0的,bzoj有时候数据不会给的很细致原创 2018-04-23 13:19:23 · 175 阅读 · 0 评论 -
SPOJ GRASSPLA Grass Planting(树链剖分)
题意:一棵树,有m次操作,每次给u,v图色或者查询u,v之间一共被涂了几次思路:树链剖分的基础题,对于每次查询和涂色,都按照正常的错做来就行了,一点一点根据链来往上爬,更新线段树即可。错误及反思:因为懒,有一部分代码沿用了上个题,结果疯狂TLE和WA,只能说不能偷懒啊,不过中途确实把很多东西重新想了好几遍,还是很不错的代码:#include#include#in原创 2018-01-27 13:46:20 · 303 阅读 · 0 评论 -
BZOJ 1036 树的统计Count(树链剖分)
题意:给你一棵树,n个节点,每个节点都有一个val,现在进行q次操作,操作有三种,第一种查询u到v的最大值,第二种,查询u到v的val和,第三种,将某个点修改val思路:树链剖分基本题,相比起前面几道树链剖分,这个题维护的是点,虽然我们从理论上来说,树链剖分是根据边来剖分的,但是其实我们维护的时候维护点更简单,所以这个题虽然写起来麻烦一点,但是逻辑上反而更顺 用两颗线段树分别维护最大值和最小值,和原创 2018-01-27 16:14:16 · 220 阅读 · 0 评论 -
Codeforces Round #316 (Div. 2) D. Tree Requests(dfs序+状态压缩)
题意:给你一颗树,父节点编号总是小于子节点编号,每个节点都有一个字符,问一个节点x的子树(包括自己)且深度为y的子节点是否能组成一个回文串思路:通过一次dfs,能够得知每个节点的dfs序和深度,如果在dfs时候将同一深度的节点放入一个数组,那么就是有序的,而dfs序有一个性质,同一子树的dfs序是相邻的,那么我们就知道了对于一个子树来说,dfs序是某一个连续的区间。 而之前我们深度的数组是有序的,原创 2018-01-19 14:21:34 · 191 阅读 · 0 评论 -
HDU 3966 Aragorn's Story(树链剖分)
题意:给你一棵树,n个节点,每个节点有一个val,p次操作,一种是每次对u到v加或者减一个数,另一种是查询某个点的值思路:树链剖分水题,简单地维护一下就好。但是,这题真正坑的地方是MLE,看到discuss里面,很多人反映G++会出问题但是C++能AC,有人说因为hdu是windows会容易爆栈,需要手动扩栈。我经过血的教训,得出结论,如果这些都没有问题,请看看自己写的数组到底有没有问原创 2018-01-28 16:04:52 · 207 阅读 · 0 评论 -
POJ 2763 Housewife Wind (树链剖分)
题意:给你n个点的树,每个边有个权值,开始处于点m,现在有q次操作,每次单点修改或者将点移动到u,对于每次移动输出经过路程的权值思路:树链剖分的基础题,不同点在于每次记得更新点时候把点的更新即可错误及反思:C++跑了1700,G++跑了2200,hdu上faq说过G++处理大量输入的时候会代码:#include<cstdio>#include<algorithm>#include<cstring原创 2018-01-28 18:47:11 · 183 阅读 · 0 评论 -
POJ 3237 Tree(树链剖分)
题意:一棵树,每个边都有一个权,现在进行一些操作,将某个边变成x,将某段边取反(就是都变成自己的相反数),查询某个区间的最大值思路:比较有意思的一个题,主要是维护线段树的时候比较有意思,我们要建立两颗线段树,一个维护最大值,一个维护最小值,在取反的时候,用lazy维护的同时,两个线段树的节点都取反然后交换,这样我们就能通过一颗维护最小值的线段树实现了维护最大值的线段树了错误及反思:看到dicuss一原创 2018-01-28 20:44:07 · 214 阅读 · 0 评论 -
BZOJ 2243 染色(树链剖分)
题意:思路:树链剖分+线段树合并 很明显的树链剖分,但是总体有点难维护,首先我们还是要利用树链剖分的性质,从根到叶的编号是从小到大的,那么我们就知道了,对于一对点,我们把其中一个点向他们的LCA向上爬的过程,所求线段树求出的区间是连续的,而对于两个区间,如果两区间连接处的端点颜色相同,就要让ans减一即可错误及反思:思路其实不难,但是出了bug就很难受,一看题就知道要20...原创 2018-04-22 17:06:50 · 178 阅读 · 0 评论 -
BZOJ 4034 树上操作(树链剖分)
题意:思路:这题让我对树剖的体会更加深入了 因为我们在组链(也就是划分轻重边)的时候,是使用dfs序来进行划分的,所以我们子树的节点也依旧是在一起的,也就是说,树剖的时候顺便标记下dfs完自己子树时候的标号,就可以顺便完成dfs序时的标号要求了错误及反思:这题没什么难的。。主要是对树剖的体会更深了代码:#include<bits/stdc++.h>using namespace std;con原创 2018-04-22 21:00:11 · 200 阅读 · 0 评论 -
luoguP3613/BZOJ4811 睡觉困难综合征/由乃的OJ
addwddaw原创 2019-05-06 17:34:41 · 160 阅读 · 0 评论