https://www.luogu.org/problemnew/show/P3865
静态区间最大值
ST算法主要用于多次询问区间内最值问题,
相比于线段树,它的程序实现更简单,运行速度最快,
它可以做到O(nlogn)的预处理,以及O(1)回答每个询问
采用ST算法的条件是没有修改操作,
所以更适用于没有修改操作并且询问次数较多的情况
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=100010; 6 int a[MAXN]; 7 int f[MAXN][32]; 8 int n, m; 9 int query(int l,int r){ 10 int z=0; 11 while((1<<z+1)<=r-l+1) z++;//等价于z=log2(l-r+1) 12 return max(f[l][z],f[r-(1<<z)+1][z]); 13 } 14 15 int main(){ 16 scanf("%d%d",&n,&m); 17 for(int i=1; i<=n; i++) 18 scanf("%d",&a[i]); 19 for(int i=1; i<=n; i++) 20 f[i][0]=a[i]; 21 for(int j=1; (1<<j)<=n; j++) 22 for(int i=1; i+(1<<j)-1<=n; i++) 23 f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]); 24 while(m--){ 25 int l, r; 26 scanf("%d%d",&l,&r); 27 printf("%d ", query(l,r)); 28 } 29 return 0; 30 }