倍增 Binary Lifting
倍增是一个很通用的基础算法,将线性的处理转化为对数级的处理,优化时间复杂度。
倍增的主要实现通过预先计算的“指针表”来完成,基本步骤分成预处理和实际计算两步:
- 预处理:预先计算指针表,比如在树上用倍增来跟踪祖先时,我们可以计算:每个节点的上一辈祖先,上两辈祖先,上四辈祖先,上八辈祖先,…,上\(2^k\)辈祖先。
- 实际计算:类似二分查找,从最远的指针开始尝试(可以理解成从高位开始依次尝试改变二进制位),逐步接近要计算的结点。
具体应用包括RMQ、LCA、最小瓶颈树等。
代码实现可以看LCA中倍增的使用。
习题
- P8251 [NOI Online 2022 提高组] 丹钓战 提高+/省选-
- P7167 [eJOI 2020 Day1] Fountain 普及+/提高 单调栈+倍增