ST表 洛谷 P3865 ST表模板题
首先,来说说为什么学ST表哈。
ST表类似于树状数组和线段树这两种数据结构
在解决RMQ问题时,ST表和线段树的预处理时间复杂度都是O(nlogn),两者的不同在于,在查询RMQ答案时,ST表的时间复杂度为O(1),而线段树却有 O (logn),这是ST表的优势就完全体现出来了。
ST表实际上是一个二维数组 ST[i] [j],含义是:从下标i 到下标 i+2^j-1 的最值
因为是可以直接套用的模板,所以就直接上代码了:
//ST表模板题
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int n,m,l,r;
int a[maxn];
int ST[maxn][20];
void pre(){
for(int i=1;i<=n;i++)
ST[i][0]=a[i];//先将起点赋值
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j+(1<<i)-1<=n;j++)//此处j代表起点,i代表到达的2^i-1的长度
ST[j][i]=max(ST[j][i-1],ST[j+(1<<(i-1))][i-1]);
}
int getans(int l,int r){
int k=(int)(log((double)(r-l+1))/log(2.0));//获取你需要跨越的长度2^k-1
return max(ST[l][k],ST[r-(1<<k)+1][k]);
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
pre();
while(m--){
scanf("%d %d",&l,&r);
printf("%d\n",getans(l,r));
}
return 0;
}