zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    13-17读后感
    读10 11 12章
    读书作业
    5.2.3
    测试与封装
    作业四
    作业三
    实验四 主存空间的分配和回收模拟
    评论
    实验三 进程调度模拟程序
  • 原文地址:https://www.cnblogs.com/wangyifan124/p/10964218.html
Copyright © 2011-2022 走看看