LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法:
暴力向上:O(n)
每次将深度大的点往上移动,直至二者相遇
树剖:O(logn)
在O(2n)预处理重链之后,每次就将深度大的沿重链向上,直至二者在一条链上
tarjan_lca:离线O(n+m)
先记录所有的询问,对树进行一次dfs,对于搜索到的点u,先将点u往下搜,再将点u与父节点所在集合合并,之后对于它的所有询问(u,v),若v已被访问,那么找v所在集合的祖先e,则e就是u与v的lca
但我们今天要讲的是
倍增lca
所谓倍增,就是利用二进制将冗长的多个相同步骤合并,