长链剖分
posted on 2025-04-19 02:41:27 | under | source
糖丸了。
算法
记 \(wson_x\) 为 \(x\) 子树内深度最深的节点所在的儿子子树。
这样的剖分叫长剖。
性质
- \(x\) 的 \(k\) 级祖先所在的长链长度 \(\ge k\)。显然。
- \(x\) 到根的路径上有 \(O(\sqrt n)\) 条长链。
应用
求 \(k\) 级祖先
由性质,令 \(2r\ge k\),那么先跳到 \(r\) 级祖先 \(y\)。记 \(y\) 的链顶为 \(z\),假如跳 \(k-r\) 步不到 \(z\),预处理长链节点即可回答。否则相当于从 \(z\) 跳 \(\le r\) 步,也是可以预处理。
取 \(r\) 为 \(k\) 的最大二进制位即可。瓶颈在于倍增预处理 \(O(n\log n)\)。\(O(1)\) 回答。
优化树上与深度有关的 dp
思想就是继承重儿子,暴力转移轻儿子。显然 \(O(n)\)。

浙公网安备 33010602011771号