简介
ST表用于区间RMQ问题,它可以做到O(nlogn)预处理,O(1)查询最值。相比线段树,更加有利于静态数据的最值问题。主要是利用倍增的思想。
洛谷:P3865
模板
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1e6 + 10;
int Max[MAXN][22];
int Min[MAXN][22];
int n,m;
void QST();
int QueryMax(int ,int );
int QueryMin(int ,int );
int main() {
scanf("%d%d",&n,&m);
QST();
for(int i = 1;i <= m;++i) {
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",QueryMax(l,r));
}
return 0;
}
void QST() {
for(int i = 1;i <= n;++i) scanf("%d",&Max[i][0]);
for(int i = 1;i <= n;++i) Min[i][0] = Max[i][0];
for(int j = 1;j <= 21;++j)
for(int i = 1;i + (1 << j)- 1 <= n;++i) {
Max[i][j] = max(Max[i][j - 1],Max[i + (1 << (j - 1))][j - 1]);
Min[i][j] = min(Min[i][j - 1],Min[i + (1 << (j - 1))][j - 1]);
}
}
int QueryMax(int l,int r) {
int k = log2(r - l + 1);
return max(Max[l][k],Max[r - (1 << k) + 1][k]);
}
int QueryMin(int l,int r) {
int k = log2(r - l + 1);
return min(Min[l][k],Min[r - (1 << k) + 1][k]);
}
文章评论