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 ...
那么,对于x的子树区间为dfn[x] ~ dfn[x] + siz[x] - 1,同理,y的子树。那么,比较显然的,这不就是用dfs序来构造一个主席树,然后在主席树上进行差分,找到x子树对于y子树的贡献吗? 所以,我们可以利用虚树来找到这样的u、v对,然后我们让dfs序小的指向dfs序大的,最后,我们对它的dfs序上建立可持久化线段树...
LOJ146DFS 序 3,树上差分 1 LOJ146 这道题可以说是真的板子题啦 恩一看就想到了树链剖分,于是乎很快码出了代码 Code1: View Code 正常情况的话就结束了吧 但是!!(毒瘤啊)我们发现T了一个点,于是乎我用尽了各种优化手段,不过都无济于事,想来是算法上该改进一波了,偷瞄了巨佬的代码发现可以用LCA和树状...
(树上差分+dfs序+树状数组) 对每个权值分别考虑。则只有单点加路径求和的操作。树上差分转化为求到根的路径和,子树加即可。再差分后bit即可。注意树上差分中根的父亲是0,已经忘了是第几次因为这个挂了。 #include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm...
思路:此题明显地体现了我对主席树理解不深 树上路径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)...
就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以看做对于子树中的每一个点进行 a*(deep[x]-deep[root]+1) root是子树根节点,那么我们对 k 用a差分区间 对b用 -a*(deep[root]-1)差分...
首先考虑用S建AC自动机,然后对每一个点建fail[i]->i的dfs树,然后把每次添加的T串丢到AC自动机上跑。每次跑的时候记录T串每个位置在AC自动机里的位置。排序后(因为如果不排序的话,这些点就杂乱无章,就无法有效地进行树上差分,我们要的是每次T串丢进来看该点有没有使用过而已,所以如果你学过虚树会有所...