什么是RMQ (RMQ:Range Minimum/Maximum Query)
RMQ是指在区间内寻找最大或最小值的问题
给出一个包含 n 个数字的数组 a 和 m 个询问 [ l,r ]
要求输出 a [ l ] 到 a [ r ] 中最大 / 最小的数
举个栗子,数组:1,2,3,4,5
询问:l = 2,r = 4
显然,2,3,4 中最大的数字是 4
乍一看这个问题非常简单,每次询问时使用for循环跑一遍,再输出最值就可以了
但在 1 ≤ n ≤ 10 ^ 5,1 ≤ m ≤ 2 × 10 ^ 6 的数据范围下,这种 O ( n ^ 2 × m ) 的方法显然会TLE
解决方法:ST表(ST:Sparse Table Algorithm)
ST表是一种能解决RMQ问题的算法,运用了常见的倍增思想,比较容易理解
我们使用数组 f [ i ] [ j ] 表示 a [ i ] 至 a [ i + 2 ^ j - 1 ] 中的最值
首先预处理 f 数组,代码如下:
for(int i=1;i<=n;i++){
f[i][0]=a[i]; // f[i][0] 即 a[i] 至 a[i+2^0-1] 中的最值即 a[i]
}
for(int j=1;(1<<j)<=n;j++){ // 1<<j 即 2^j,