RMQ问题&ST算法

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int N = 1e5 + 5;
 6 
 7 int f[N][30],a[N];
 8 
 9 int read(){
10     int x=0,flag=1;
11     char ch=getchar();
12     while(!isdigit(ch)){ if(ch == '-') flag = -1;ch = getchar();}
13     while(isdigit(ch)){ x = (x<<3) + (x<<1) + (ch^48); ch = getchar();}
14     return x * flag;
15 }
16 
17 int main(){
18     
19     int n = read();
20     int m = read();
21     //³õʼ»¯ 
22     for(int i=1; i<=n; i++) f[i][0] = read();
23     //½¨Á¢ST±í 
24     int maxn = log(n) / log(2) + 1;//ÉϽç 
25     for(int j=1; j<maxn; j++){
26         for(int i=1; i<=n+1-(1<<j); i++){
27             f[i][j] = max(f[i][j-1],f[i+(1<<j-1)][j-1]);
28         }
29     }
30     //²éѯ 
31     for(int i=1; i<=m; i++){
32         int l = read();
33         int r = read();
34         int k = log(r-l+1) / log(2);//Ͻç
35         printf("%d\n",max(f[l][k],f[r+1-(1<<k)][k]));
36     } 
37     return 0;
38 }

猜你喜欢

转载自www.cnblogs.com/zhangqiling/p/12464617.html