倍增其实就是二分的逆向,二分是逐渐缩小范围,而倍增是成倍扩大。
用于解决一些静态树的查询问题。
【模板】最近公共祖先
如何计算树上任意两点 x 和 y 的最近公共祖先 lca 呢?
设节点 i 的深度为 depth[i]。这可以通过一次 DFS 预处理出来。
假设 depth[x] ≤ depth[y](否则交换两点)。可以先把更靠下的 y 更新为 y 的第 depth[y] − depth[x] 个祖先节点,这样 x 和 y 就处在同一深度了。
如果此时 x = y,那么 x 就是 lca。否则说明 lca 在更上面,那么就把 x 和 y 一起往上跳。
由于不知道 lca 的具体位置,只能不断尝试,先尝试大步跳,再尝试小步跳。设 i = ⌊ l o g 2 n ⌋ i= ⌊log_2n⌋ i=