闲话
似乎会有很多种树剖,什么长链剖分之类的,但是暂时只会轻重链剖分(可怜)。
以前的版本在这里,但是感觉写的太粗糙了,所以决定重写一篇(我也不知道为什么要一直写树剖而不写点别的)。
正文
引入
如果给出一个序列,有一些区间修改查询之类的操作,直接上线段树什么的就完事了,但是如果给出的是一棵树呢?显然没有办法直接维护。那么既然我们可以做序列,为什么不把树按照一定的顺序变成序列呢?这就是今天的主角——轻重链剖分,当然你也可以说是树链剖分,按照轻重链划分的方法只是其中一种。
轻重链剖分
定义
在介绍具体的算法流程前,我们需要明确一些定义:
- 重儿子:对于每一个非叶子节点,它的子节点中,子树大小最大的那个子节点被称为重儿子。
- 轻儿子:对于每一个非叶子节点,除了重儿子以外的子节点都是它的轻儿子。
- 重边:任意两个重儿子以及重儿子和其父节点之间的连边称为重边。
- 轻边:除去重边剩下的边。
- 重链:多条(\(\geq 1\))重边相连组成的链即为重链,且重链一定以轻儿子为起点。
- 此外,若一个叶子节点是轻儿子,那么它也可以视为一条重链。
这些就比较形式化了。具体到代码中,我们需要
标签:链剖分,浅谈,剖分,儿子,重边,节点,轻重 From: https://www.cnblogs.com/LHLeisus/p/qian-tan-shu-lian-pou-fen-qing-zhong-lian-pou-fen.html