本页面将简要介绍倍增法。

定义

倍增法(英语:binary lifting),顾名思义就是「成倍增长」。我们在进行递推时,如果状态空间很大,通常的线性递推无法满足时间与空间复杂度的要求,那么我们可以通过成倍增长的方式,只递推状态空间中在 的整数次幂位置上的值作为代表。当需要其他位置上的值时,我们通过「任意整数可以表示成若干个 的次幂项的和」这一性质,使用之前求出的代表值拼成所需的值。所以使用倍增算法也要求我们递推的问题的状态空间关于 的次幂具有可划分性。通常情况下 1

这个方法在很多算法中均有应用,其中最常用的是 RMQ 问题和求 LCA(最近公共祖先)

应用

RMQ 问题

参见:RMQ 专题

RMQ 是 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。使用倍增思想解决 RMQ 问题的方法是 ST 表

树上倍增求 LCA

参见:最近公共祖先

例题

题 1

例题

如何用尽可能少的砝码称量出 之间的所有重量?(只能在天平的一端放砝码)

题 2

例题

给出一个长度为 的环和一个常数 ,每次会从第 个点跳到第 个点,总共跳了 次。每个点都有一个权值,记为 ,求 次跳跃的起点的权值之和对 取模的结果。

数据范围:

Footnotes

  1. 引用自李煜东《算法竞赛进阶指南》0x06. 倍增一节

此文件夹下有0条笔记。