知识介绍
用途:可以做到子树,重链,轻儿子的编号连续,进而使用序列数据结构进行相关信息维护。
做法:递归到当前点u时,先给重儿子标号,再递归入重儿子,递归回溯后一次性给所有轻儿子标号,再分别递归轻儿子。
性质:
- 一个点u子树内的编号连续。
- 对于一条重链,除了链头以外,其他点的编号自顶向下连续。
- 对于一个点,其轻儿子的编号为一个区间。
这意味着,其所能维护的信息应当在几乎所有情况下大于重链剖分,线段树能进行的区间操作可以在链,子树,一个点的所有儿子上进行。
适配场景
目前想到的有两个,圆方树和ddp,优点是可以维护的信息不需要可减性。
圆方树应用
例题:CF487E Tourists。
这题的圆方树建立是广为人知的。我们有了这个科技之后可以不像别的题解一样给每个方点都维护一个multiset,而是只需要在某个圆点修改后,重新查询其方点父亲的所有轻儿子+重儿子+父亲的贡献并相应修改方点贡献。
ddp应用
是通用的。由于正好ddp需要用到一个点所有轻儿子的贡献之和,我们令 \(h_u\) 表示点 \(u\) 的轻儿子贡献之和,\(g_u\) 只有在点 \(u\) 是重链链头时有意义,表示这个点的子树dp完了之后的dp值(一个向量)。
当对一个点 \(p\) 进行矩阵修改之后,跳到链头,计算并修改链头的 \(g_{top}\),然后计算 \(top\) 的父亲 \(r\) 的新 \(h_r\),只需查询 \(r\) 的所有轻儿子的 \(g_x\) 之积即可。
不需要信息的可减性是一大亮点,但目前没有发现复杂度更优的情况,甚至在ddp中比GBST的单log劣。或许是鸡肋一只吧。
参考博客:https://www.cnblogs.com/Charlie-Vinnie/p/18075433