长链剖分
考虑将重儿子设为链最长的那一个
这样剖分有一些性质
-
链长和是 $n$
因为每个点都在且仅在一条链中, 。 -
任意点 $x$ 的 $k$ 级祖先 $y$ 到它所在的长链底端距离不小于 $k$
因为如果 $x$ 和 $y$ 在同一条长链上。 那么 $y$ 所在的长链长度不小于 $k$, 如果它们不在同一条的长链上。 那么 $y$ 到另一条长链底端的距离一定大于 $k$, 否则的话 $x$ 所在的链就可以接在 $y$ 上成为更长的链, 。 -
从任意一个点开始跳重链的次数最多是 $\sqrt{n}$ 级别的
因为容易知道每次跳到的长链长度一定大于当前链。 于是最坏情况是分别经过了长度为 $1, 2, 3, \cdots, \sqrt{n}$ 的长链, 最多跳 $\sqrt{n}$ 次, 。
$\Theta(n \log n) - \Theta(1)$ 算 $k$ 级祖先
考虑预处理每个点的 $2$ 的幂次级祖先
由于长链长度之和为 $n$
这样
时间复杂度 $\Theta(n \log n)$ 预处理