LCA的离线算法。复杂度为O(n+q)。
这个算法充分利用了dfs树的结构。
对于每个节点u,关于它的询问(u,v)只有两种。(假设先dfs(u)后dfs(v))
1、v在u的子树内。
此时LCA(u,v) = u.
2、v不在u的子树内。
⑴假设v在u的父亲的另一棵子树内。
此时LCA(u,v) = father[u].
⑵如果不满足条件⑴,则v可能在u的父亲的父亲的另一棵子树内。
而此时LCA(u,v) = father[ father[u] ].
⑶……
观察一下,是不是发现了什么呢?
没错,不论是哪种情况,LCA(u,v)都与u和father[ ]有某种关系。我们能不能抓住这种关系呢?
我们继续观察,一直向上取father[ ......
阅读全文