模板:ST算法及ST表

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 }
原文地址:https://www.cnblogs.com/Aze-qwq/p/9890720.html