传送门:洛谷-ST表
给定一个长度为 N N 的数列,和 M M 次询问,求出每一次询问的区间内数字的最大值。
1≤N≤105
1
≤
N
≤
10
5
,
1≤M≤106
1
≤
M
≤
10
6
,
ai∈[0,109],1≤li≤ri≤N
a
i
∈
[
0
,
10
9
]
,
1
≤
l
i
≤
r
i
≤
N
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,m;
int f[N][25],l,r,ans;
inline int max(int x,int y)
{
return x>y? x:y;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&f[i][0]);
}
int flor=(int)(log(n)/log(2))+1;
for(int i=1;i<=flor+1;i++){
int mx=n-(1<<i)+1;
for(int j=1;j<=mx;j++){
f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
}
}
while(m--){
scanf("%d%d",&l,&r);
int len=(int)(log(r-l+1)/log(2));
printf("%d\n",max(f[l][len],f[r-(1<<(len))+1][len]));
//不需要考虑重叠
/*ans=f[l][len];l+=(1<<len);
while(l<=r){
len=(int)(log(r-l+1)/log(2));
ans=max(ans,f[l][len]);
l+=(1<<len);
}
printf("%d\n",ans);*/
}
return 0;
}