长链剖分优化dp
2023年暑假学了,结果没过多久又忘了,故写个blog记录一下。
长链剖分基础
定义
长链剖分,就是类似于重链剖分一样只不过是把重儿子的定义改为了子树深度最大的子节点。
性质
长链剖分通常有以下几个性质:
1.长链个数不超过 \(n\) 个,更准确的说是叶子个数个。
2.树上任意一点的 \(k\) 级祖先所在的长链长度大于 \(k\)。
3.树上任意一点每次跳它所在的长链链头再跳长链链头的父亲,最多跳 \(\sqrt{n}\) 次即可跳到根节点。
应用
常见的应用就例如树上 \(k\) 级祖先。
我们先求出每个点向上跳 \(2^i\) 次方后到达的位置以及每个长链链头向上跳链长以内步到达的节点和从链头往下跳链长以内步到达的节点。
设 \(2^q\) 为小于 \(k\) 的最大的二的次幂,那么先跳 \(2^q\) 祖先,然后根据性质2,我们直接跳到此时所在节点所在的长链的链头,如果跳多了,就往下跳,否则往上跳。
长链剖分优化dp
长链剖分可以把维护子树中只与深度有关的信息优化到线性。
长链剖分优化dp的过程:长链剖分后,在维护信息的过程中,先 \(O(1)\) 继承重儿子的信息,再暴力合并其余轻儿子的信息。
发现复杂度是正确的,因为只有每个长链的链头会在它的父亲节点被合并,所以复杂度是正确的。
需要注意的是,当你继承重儿子的信息时,你需要 \(O(1)\) 继承,故需要指针。
一些例题:CF1009F

浙公网安备 33010602011771号