[模板]树链剖分
link 树链剖分,感觉是一个很神奇的东西,但是其实并不是那样的 树链剖分其实就是一个线段树 线段树处理的是连续区间,所以当你要加的时候都是连续区间修改 所以可以用轻重链的方式将树分解成为链条,然后用线段树处理 可以很容易看到,为什么用的是dfs但不是用的是bfs呢 因为dfs保持了重链是连续的,所以可以用top[x]记录已x为节点的重链最上方,一个点也包含在重链内 若修改区间为(u,v),但是重链的祖先是一起的,所以当他们的LCA相同时,边break 所以现在u,v是连续的 所以查询(u,v)的简单路径和也就处理了 所以说线段树中可以进行的操作在树上也可以执行了 在处理一个问题 在u的子树上加w 所以修改的区间是u在线段树中的位置$(t)$ 到 $t+size(u)-1$ $size$ 记录以它为根 的子节点个数 $deep(x)$ 深度 $father(x)$ 记录父亲 $son(x)$ 它的重儿子 $top(x)$ 所在重路径的顶部节点 $seg(x)$ x在线段树中的编号 $rev(x)$ 线段树中x的位置所对应的树中节点编号 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; inline int