关于树上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)}\)
-
长链剖分(咕咕咕)
咕咕咕