首页 > 其他 > 详细

RMQ问题--ST

时间:2019-06-02 20:46:32      阅读:106      评论:0      收藏:0      [点我收藏+]
 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 }

 

RMQ问题--ST

原文:https://www.cnblogs.com/wangyifan124/p/10964218.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!