树链剖分分为重链剖分和长链剖分
重链剖分
首先是重链剖分,树链剖分顾名思义是一种将代码大小增加1k树剖成一条条链的方法。
定义:
- 重儿子 该节点所有儿子中以该儿子为根的子树最大的儿子
- 重边 连接该节点与该节点的重儿子的那条边
- 重链 由根节点或一个轻儿子为链头一路重边连到叶子节点的链
总结一下就是将一棵树的每一个点给上一个新的编号,每个点的编号就是每个点(在先遍历重儿子后其他儿子的规则下)的 dfn 序列
这么重新编号完之后就可以得到几个规律:
- 每条重链的编号从上往下是连续的 --- 因为先遍历重儿子
- 每棵子树的编号是连续的 -- 因为是 dfn 序
- 如果边(u, v)为轻边,$Size(v) \le Size(u)/ 2$
- 树中任意两个节点之间的路径中轻边的条数不会超过 $log_{2}n$,重路径的数目不会超过 $log_{2}n$。
由上面这些规则我们不难发现许多树上操作可以被分为多个连续区间的区间操作解决,所以我们就想到了树状数组,线段树等等等等与其配套使用。
P.S:剖完后要注意哪里用的是原 id,哪里用的是重排过的 dfn 序。
例题见于 题单
标签:剖分,儿子,编号,树链,重链,节点 From: https://www.cnblogs.com/Assassins-Creed/p/18018383