倍增(RMQ):用于计算区间极值
使一步一步增加转变为2^k步增加。举个例子:
一只兔子从1跳到10,一步一步跳要10步,倍增的思想是:
先跳8步,没到,跳到9.
跳4步,过头了,不跳.
跳2步,过头了,不跳.
跳1步,到了,跳到10.
时间复杂度是从O(n)到O(log2n);
洛谷例题Balanced Lineup G
这是一道求区间内最大值和最小值的题。典型倍增题。
我们用f[i][j]记录以i为起点,长度为2^j的区间内的最小值,f[i][0]就是当前位置的点。我们用式子f[i][j]=max(f[i][j-1],f[i+(1<<(j-1)][j-1])来计算。
我们将f[i][j]以i为起点,长度为2^ j的区间分成两部分求,是以i为起点,长度为2^ (j-1)的区间最大值与以i+(1<<(j-1)为起点,长度为2^ (j-1)的区间最大值中的较大值。之后再分解到每个点,就可得到最大值。
如图分别求黄色区间和红色区间最大值
最小值g[i][j]同上。
这里的k我随便取到个最大值到20,只要2^k能超过题目的数据范围就行
代码
#include