结合之前的 LCA blog.
我们又发现如果使用 tarjan
算法,时间复杂度为 O ( n q ) O(nq) O(nq),如果询问次数 q q q 较大,再结合一些小小的常熟,可能会 TLE
。
于是我们有了新的思路——欧拉序结合 RMQ
。
什么是欧拉序?
还是这张图
该图的欧拉序即为:
a b a c d c e c a abacdceca abacdceca
然后我们可以发现,如果求 b b b 与 e e e 的 LCA
就是欧拉序中 b b b 至 e e e 中层数最小的所对应的字母,而区间最小用什么,当然是 RMQ
啊!
所以我们只需要跑一遍 dfs
预处理出欧拉序,再跑一遍 RMQ
预处理区间最小值,最后输出答案即可(注意细节的处理!)
时间复杂度 O ( n + n l o g n + q ) O(n+nlogn+q) O(n+