关于树上k级祖先

关于 \(Level\ Ancestor\) 问题(树上 \(k\) 级祖先)的 \(\infty\) 种求法:

\(\large\texttt{Warning:}\) 此篇博客其实是对 \(Luogu\ P5903\) 题解区中一些方法的汇总梳理,并不是本人原创!!!

  • 树上倍增法:

    主要思路:通过倍增的思想,存下 \(x\)\(2^i\) 级祖先,在查询时将 \(k\) 进行二进制分解,分解为 \(\displaystyle\sum^t_{i=1}2^{a_t}\) 次方的形式,再每次向上跳 \(2^{a_t}\) 步,跳完 \(t\) 次后就得到了 \(x\)\(k\) 级祖先。

    时间复杂度:\(\cal{O((n+q)\log_2n)}\)

    空间复杂度:\(\cal{O(n\log_2n)}\)

  • 轻重链剖分法:

    主要思路:进行轻重链剖分,在查询时判断当前点 \(x\) 所在的重链顶点是否在其 \(k\) 级祖先上放。若不在其上方,则将 \(x\) 跳至链顶的父亲节点,并让 \(k\) 减去这一段的长度,并继续处理。否则则利用求出的 \(\texttt{dfs}\) 序直接计算。

    时间复杂度:\(\cal{O(n-q\log_2n)}\)

    空间复杂度:\(\cal{O(n)}\)

  • 轻重链剖分法 + 树上倍增法:

    主要思路:在轻重链剖分法的基础上,利用倍增预先处理出向上跳 \(2^i\) 次能到达的节点,就可以优化时间复杂度了。

    时间复杂度:\(\cal{O(n\log_2\log_2 n - q\log_2\log_2 n)}\)

    空间复杂度:\(\cal{O(n\log_2\log_2 n)}\)

  • 长链剖分(咕咕咕)

咕咕咕

posted @ 2021-10-20 21:42  佐世保の时雨酱  阅读(101)  评论(1)    收藏  举报