花式求LCA
设树上有两点x、y,要求他们的lca(最近公共祖先) 1、倍增求LCA: 先预处理出树上每个点的向上2^k的祖先。 再看x、y:先把深度深的倍增跳到和深度浅的一样的深度,判断是否在同一点:是,该点即为lca;不是,就将两点一起倍增向上跳到最高的不同的两点,它们的父亲就是lca。 正确性:数可用二进制表示。 2、RMQ求LCA: https://www.luogu.org/blog/hicc0305/solution-p3379 正确性:从f小的点x到f大的点y,经过了:x的一部分(或全部)子树,x到lca的路径,lca到y的路径上的点的一部分(或全部)子树、lca到y的路径。显然,其中深度最浅的只能是lca。 3、Tarjan求LCA: https://www.cnblogs.com/abc2237512422/p/9832468.html 正确性:由两点间路径的唯一性可知,每个遍历过的点所在并查集的祖宗就是当前点和这个遍历过的点的lca。(假设先遍历了x,若当前遍历到y,一定是从x回溯到了x和y的lca后再到了y,由于并查集是在回溯时为维护的,当x回溯到lca后x所在并查集就会并到lca所在的并查集,但由于lca还没有回溯到它的父亲,所以它的并查集还没有与它的祖先合并) 4、树链剖分求lca: