RMQ问题--ST

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 const int maxn = 1e5+5;
 6 int f[maxn][25];
 7 int n,m;
 8 inline int RMQ(int l,int r){
 9     int k = log2(r-l+1);
10     return min(f[l][k],f[r-(1<<k)+1][k]);
11 }
12 inline void ST(){
13     for(int j = 1;j <= 20;j++)
14         for(int i = 1;i <= n;i++)
15             if(i+(1<<j)-1 <= n)
16                 f[i][j] = min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
17 }
18 int main(){
19     cin>>n>>m;
20     for(int i = 1;i <= n;i++)
21         scanf("%d",&f[i][0]);
22     ST();
23     for(int i = 1,x,y;i <= m;i++){
24         scanf("%d%d",&x,&y);
25         printf("%d ",RMQ(x,y));
26     }
27     return 0;
28 }
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxn = 1e5+5;
 5 int a[maxn],f[maxn][25],log[maxn];
 6 int n,m;
 7 inline int RMQ(int l,int r){
 8     int k = log[r-l+1];
 9     return min(f[l][k],f[r-(1<<k)+1][k]);
10 }
11 inline void ST(){
12     log[0] = -1;
13     for(int i = 1;i <= n;i++){
14         f[i][0] = a[i];
15         log[i] = log[i>>1]+1;
16     }
17     for(int j = 1;j <= log[n];j++)
18         for(int i = 1;(i+(1<<j)-1 <= n) && (i <= n);i++)
19             f[i][j] = min(f[i][j-1],f[i+(1<<j-1)][j-1]);
20 }
21 int main(){
22     cin>>n>>m;
23     for(int i = 1;i <= n;i++)
24         scanf("%d",&a[i]);
25     ST();
26     for(int i = 1,x,y;i <= m;i++){
27         scanf("%d%d",&x,&y);
28         printf("%d ",RMQ(x,y));
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/wangyifan124/p/10964218.html