ST
表
原理
见《进阶指南》第41
页。
预处理
记录从到共个数的最大值。
状态转移方程:。
两个上界:
由得,。
由得, 。
查询
下文以len
表示待查询区间的长度。
设。
当待查询区间的长度是
2
的非负整数次幂时,。当待查询区间的长度不是
2
的非负整数次幂时,。
时间复杂度
预处理:。
查询:。
模板题
#include <iostream>
#include <cmath>
using namespace std;
const int N = 100010;
int n, q;
int a[N], f[N][20];
void ST_create () {
for (int i = 1; i <= n; ++ i) f[i][0] = a[i];
int k = log(n) / log(2);
for (int j = 1; j <= k; ++ j)
for (int i = 1; i <= n - (1 << j) + 1; ++ i)
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
int ST_query (int l, int r) {
int k = log(r - l + 1) / log(2);
return max(f[l][k], f[r - (1 << k) + 1][k]);
}
int main () {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; ++ i) scanf("%d", &a[i]);
ST_create();
while (q --) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", ST_query(l, r));
}
return 0;
}