Problem
- 维护一个至多 n n n节点的森林, Q Q Q个操作,支持连边和查询两点 L C A LCA LCA .
Data constraint
- 1 ≤ N ≤ 100000 , 1 ≤ Q ≤ 100000 1\le N\le 100000,1\le Q\le 100000 1≤N≤100000,1≤Q≤100000
Solution
1. 离线做法
-
首先考虑比较简单的离线做法.
-
我们可以考虑先把最终的森林给构出来.
-
再每棵树上任意找一点 R t Rt Rt作为原始根,然后求个倍增数组.
-
然后扫一遍询问,并查集维护到每一个询问操作时,两个点 u , v u,v u,v所在的树的真正根 r o o t root root.
-
那么答案其实就是拥有 l , r , r o o t l,r,root l,r,root两两 L C A LCA LCA的最大深度的那个点.
-
具体证明可以分类讨论,这是一种很经典的套路.
-
其实这种套路在5783. 【省选模拟2018.8.8】树 这道题里也出现了,当时我乱搞搞出来了,但这一次却没有想到.
2.在线做法
-
为了使自己印象更深刻一些,下次遇到这种求LCA的题目能更灵活变通,我还打了一下在线做法.
-
不难发现离线做法的时间复杂度实际上就是找 L C A LCA LCA的时间复杂度,这个可以在 O ( n l o g n ) O(nlogn) O(nlogn)时间内做到.
-
但如果强制在线,我们需要怎样做呢?
-
很容易想到的是启发式合并倍增数组.
-
但问题是合并后很有可能根会发生改变,也就是倍增的根与当前真正的根不一样.
-
显然,这就是上面离线所说的,需要做的3次LCA.
-
时间复杂度近似 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n),实际上远远比这小.