zoukankan      html  css  js  c++  java
  • rmq模板

    /*
    HDU 3183
    */
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<string.h>
    using namespace std;
    const int MAXN=1010;
    int a[MAXN];
    int dp[MAXN][20];
    
    void makeRMQIndex(int n,int b[])//形成最小值下标的RMQ
    {
        for(int i=0;i<n;i++)
          dp[i][0]=i;
        for(int j=1;(1<<j)<=n;j++)
           for(int i=0;i+(1<<j)-1<n;i++)
              dp[i][j]=b[dp[i][j-1]]<=b[dp[i+(1<<(j-1))][j-1]]?dp[i][j-1]:dp[i+(1<<(j-1))][j-1];
              //这里一定要加等号,就是相等的时候取下标小的
    }
    int rmqIndex(int s,int v,int b[])
    {
        int k=(int)(log(v-s+1.0)/log(2.0));
        return b[dp[s][k]]<=b[dp[v-(1<<k)+1][k]]?dp[s][k]:dp[v-(1<<k)+1][k];
        //加等号,取小标小的
    }
    char str[MAXN];
    int ans[MAXN];
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int m;
        while(scanf("%s%d",&str,&m)!=EOF)
        {
            int n=strlen(str);
            for(int i=0;i<n;i++)
                   a[i]=str[i]-'0';
            makeRMQIndex(n,a);
            int t=0;
            int temp=0;
            for(int i=m;i<n;i++)//找n-m个数,每次从[t,i]中找最小的
            {
                t=rmqIndex(t,i,a);
                ans[temp++]=a[t++];
            }
            t=0;
            while(t<temp&&ans[t]==0)t++;
            if(t>=temp)printf("0
    ");
            else
            {
                for(int i=t;i<temp;i++)printf("%d",ans[i]);
                printf("
    ");
            }
        }
        return 0;
    }
    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<string.h>
    using namespace std;
    const int MAXN=50050;
    
    int dpmax[MAXN][20];
    int dpmin[MAXN][20];
    
    void makeMaxRmq(int n,int b[])
    {
        for(int i=0;i<n;i++)
           dpmax[i][0]=b[i];
        for(int j=1;(1<<j)<=n;j++)
          for(int i=0;i+(1<<j)-1<n;i++)
            dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
    }
    int getMax(int u,int v)
    {
        int k=(int)(log(v-u+1.0)/log(2.0));
        return max(dpmax[u][k],dpmax[v-(1<<k)+1][k]);
    }
    void makeMinRmq(int n,int b[])
    {
        for(int i=0;i<n;i++)
           dpmin[i][0]=b[i];
        for(int j=1;(1<<j)<=n;j++)
          for(int i=0;i+(1<<j)-1<n;i++)
            dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
    }
    int getMin(int u,int v)
    {
        int k=(int)(log(v-u+1.0)/log(2.0));
        return min(dpmin[u][k],dpmin[v-(1<<k)+1][k]);
    }
    
    int a[MAXN];
    int main()
    {
        int n,Q;
        int u,v;
        while(scanf("%d%d",&n,&Q)!=EOF)
        {
            for(int i=0;i<n;i++)
               scanf("%d",&a[i]);
            makeMaxRmq(n,a);
            makeMinRmq(n,a);
            while(Q--)
            {
                scanf("%d%d",&u,&v);
                u--;
                v--;
                int t1=getMax(u,v);
                int t2=getMin(u,v);
                printf("%d
    ",t1-t2);
            }
        }
        return 0;
    }
  • 相关阅读:
    Exadata 上关于SAS盘的小秘密
    Python 全栈开发:python循环语句while
    Python 全栈开发:python条件语句if..else..
    Python 全栈开发:python基础
    Python 全栈开发:python初识
    计算机基础(简单了解)
    如何计算网络配置中广播域和冲突域的数目?
    使VS开发的程序在Win7系统运行时自动提升权限
    在程序中通过Process启动外部exe的方法及注意事项
    获取指定目录下多种格式的文件
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5269861.html
Copyright © 2011-2022 走看看