树上k级祖先

树上k级祖先

直接倍增/树剖

显然是 \(O(n\log n)\)

长链剖分

时间复杂度为 O(nlogn) 预处理, O(1) 查询。

长链剖分的经典应用。

注意到,一个点向上跳 n 步以后,所处长链的长度一定大于 n (显然),于是可以先跳一个 \(2^upbit(k)\) , 然后在长链上条剩下的。

预处理

  1. 普通的长链剖分

  2. 每个点 \(2^n\) 级祖先(倍增套路求法)

  3. 对于长度为len的链,处理出顶点向上走len和向下走len的位置, \(O(n)\)

  4. 处理出每个数二进制下最高位 \(h_i\) (似乎用高科技,不处理也可以O(1)查?)

查询

  1. 利用倍增数组先将 x 跳到 x 的 \(2^{h_k}\), 剩下的步数 k' 小于 \(2^{h_k}\)

  2. 由于长链长度 > k',因此可以先将 x 跳到 x 所在链的顶点,若之后剩下的级数为正,则利用向上的数组求出答案,否则利用向下的数组求出答案。

posted @ 2025-03-05 15:00  花子の水晶植轮daisuki  阅读(27)  评论(1)    收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js