树上k级祖先
树上k级祖先
直接倍增/树剖
显然是 \(O(n\log n)\)
长链剖分
时间复杂度为 O(nlogn) 预处理, O(1) 查询。
长链剖分的经典应用。
注意到,一个点向上跳 n 步以后,所处长链的长度一定大于 n (显然),于是可以先跳一个 \(2^upbit(k)\) , 然后在长链上条剩下的。
预处理
-
普通的长链剖分
-
每个点 \(2^n\) 级祖先(倍增套路求法)
-
对于长度为len的链,处理出顶点向上走len和向下走len的位置, \(O(n)\)
-
处理出每个数二进制下最高位 \(h_i\) (似乎用高科技,不处理也可以O(1)查?)
查询
-
利用倍增数组先将 x 跳到 x 的 \(2^{h_k}\), 剩下的步数 k' 小于 \(2^{h_k}\)。
-
由于长链长度 > k',因此可以先将 x 跳到 x 所在链的顶点,若之后剩下的级数为正,则利用向上的数组求出答案,否则利用向下的数组求出答案。

浙公网安备 33010602011771号