浅谈长链剖分
Last Update:
引子#
我们对树上的节点
长链剖分是一种链剖分, 每个点的重儿子被定义为其子节点中
若干条首尾衔接的重边被定义为重链. 一个没有重边连向它的节点也是一条重链(长度为 1 的). 称一条重链中深度最小的点是这个重链的顶点.
从 k 级祖先谈起#
- 一条重链的长度就是其顶点
的
由于重儿子是子节点中
最大的那个, 所有必然有若 是 的重儿子, 则 .
- 一个节点
的 级祖先 所在的重链的长度一定不小于 .
由
是 的 级祖先, 必然有 .
不妨设所在重链的顶点为 , 必然有重链长度等于 .
对于每条重链的顶点, 我们记录两个数组
对于节点
否则我们在
长链剖分优化 dp#
#
给定
对于树上的每个点
对于
且只有
对树长链剖分, 我们发现我们可以把全部信息记录在重链的顶点上来优化掉第一维. 但是其实我们不需要显式的优化掉第一维, 只需要对于每个节点开一个指针, 然后只给重链的顶点开空间, 其他重链上的点沿用那个顶点的空间即可. 时空复杂度均为