非常重要的东西
我甚至模拟赛都不打了来打笔记
很简单啊,朴素lca是这样,两个节点,先令深度相等,然后一个一个往上跳直到跳到相同的位置则那个点为两点的lca
但是令深度相等与往上跳的过程都要一个一个慢慢跳所以时间复杂度拉满了
那么我们能以什么方式优化呢
我们可以发现,每个数都可以用几个二的几次方的和的方式来表示
把一个一个往上跳的过程抽象成下图一样在数组中跳至指定位置
比如从1到7
我们可以直接一个一个跳过去
也可以预处理一个数组--x[i][j]:第i个数向右跳2^j到达的数
举个例子a[1]往右跳2^1是2[3]呈现在数组中就是x[1][1]==3
于是我们就可以
从一到五
从五到七
由此很轻易可以知道怎么树上倍增
定义fa[i][j]:第i个节点向上跳2^j到达的父节点
于是我们就可以用这个思想来优化O(n)的令深度相等与往上跳的过程成O(logn)