dfs序3--树上差分 对节点X到Y的最短路上所有点权都加一个数W, 查询某个点的权值 解: 这个操作等价于 a. 对X到根节点路径上所有点权加W b. 对Y到根节点路径上所有点权加W c. 对LCA(x, y)到根节点路径上所有点权值减W d. 对LCA(x,y)的父节点 parent(LCA(x, y))到根节点路径上...
考虑将点一层层加进去,利用set查找dfs序中前驱后继同色点,对dfs序建线段树实现动态树上差分。于是再对深度建主席树就可以在线回答询问了。 #include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>#include<vector>#include<set>usingnamespacestd;#definell long ...
• 建立 Cartesian(笛卡尔)树,将问题转化为树上的 LCA(最近公共祖先)问题。 • 对于 LCA 问题,可以考虑其 Euler 序(即按照 DFS 过程,经过所有点,环游回根的序列),即求 Euler 序列上两点间一个新的 RMQ 问题。 • 注意新的问题为 ±1 RMQ,即相邻两点的深度差一定为 1。
Q次操作,或修改单点颜色,或查询路径颜色为x的个数。 思路:由于是路径,想到树剖+线段树,但是颜色个数无法合并,因此不行。 换个思路,用差分来求,然后把每个颜色弄个线段树,然后这个颜色的线段树单点代表的是这个点到根有多少这个颜色。 如果x点加了一个颜色为y的,那么以y这棵树,就再某个范围加1,这个范围是x...
就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以看做对于子树中的每一个点进行 a*(deep[x]-deep[root]+1) root是子树根节点,那么我们对 k 用a差分区间 对b用 -a*(deep[root]-1)差分...
LOJ146DFS 序 3,树上差分 1 LOJ146 这道题可以说是真的板子题啦 恩一看就想到了树链剖分,于是乎很快码出了代码 Code1: View Code 正常情况的话就结束了吧 但是!!(毒瘤啊)我们发现T了一个点,于是乎我用尽了各种优化手段,不过都无济于事,想来是算法上该改进一波了,偷瞄了巨佬的代码发现可以用LCA和树状...
思路:此题明显地体现了我对主席树理解不深 树上路径K大可以直接用树剖+二分答案+树做 但DFS序+主席树也可以 对于点U,它能影响DFS序上的区间(st[u],ed[u]) 所以维护方法就是类似序列K大一样 s[st[u]]++ s[ed[u]+1]-- 对于路径(x,y),信息为s[x]+s[y]-s[lca(x,y)]-s[fa[lca(x,y)...
BZOJ4999:This Problem Is Too Simple!(DFS序&树上差分&线段树动态开点:区间修改单点查询) Description 给您一颗树,每个节点有个初始值。 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x。 2. Q i j x(0<=x<2^31) 表示询问i节点到j节点的路径上有多少个值为x的节点。
(树上差分+dfs序+树状数组) 对每个权值分别考虑。则只有单点加路径求和的操作。树上差分转化为求到根的路径和,子树加即可。再差分后bit即可。注意树上差分中根的父亲是0,已经忘了是第几次因为这个挂了。 #include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm...
首先考虑用S建AC自动机,然后对每一个点建fail[i]->i的dfs树,然后把每次添加的T串丢到AC自动机上跑。每次跑的时候记录T串每个位置在AC自动机里的位置。排序后(因为如果不排序的话,这些点就杂乱无章,就无法有效地进行树上差分,我们要的是每次T串丢进来看该点有没有使用过而已,所以如果你学过虚树会有所...