zoukankan      html  css  js  c++  java
  • RMQ poj 3264

    poj 3264  Balanced Lineup

    题目大意:对给定的区间求区间的最大最小值之差,利用RMQ,时间复杂度可降为O(nlog(n))

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <cmath>
    using namespace std;
    const int maxn=200000+10;
    int n,q;
    int  hmin[maxn][20],hmax[maxn][20];
    int l,r;
    inline int Min(int &a,int &b)
    {
        return a<b?a:b;
    }
    inline int Max(int &a,int &b)
    {
        return a>b?a:b;
    }
    void init()
    {
        int k=(int)(log(n*1.0)/log(2.0));
        //printf("n->%d k->%d
    ",n,k);
        for(int j=1;j<=k;j++)
        {
            for(int i=0;i+(1<<j)<=n;i++)
            {
                hmin[i][j]=Min(hmin[i][j-1],hmin[i+(1<<(j-1))][j-1]);
                hmax[i][j]=Max(hmax[i][j-1],hmax[i+(1<<(j-1))][j-1]);
                //printf("i->%d j->%d min->%d max->%d
    ",i,j,hmin[i][j],hmax[i][j]);
            }
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(~scanf("%d%d",&n,&q))
        {
            for(int i=0;i<n;i++)
            {
                scanf("%d",&hmin[i][0]);
                hmax[i][0]=hmin[i][0];
            }
            init();
            int l,r,k,ans1,ans2;
            while(q--)
            {
                scanf("%d%d",&l,&r);
                l--,r--;
                k=(int )(log((r-l+1)*1.0)/log(2.0));
                ans1=Min(hmin[l][k],hmin[r-(1<<k)+1][k]);
                ans2=Max(hmax[l][k],hmax[r-(1<<k)+1][k]);
                printf("%d
    ",ans2-ans1);
            }
        }
        return 0;
    }
    不为失败找借口,只为成功找方法
  • 相关阅读:
    Saltstack
    搭建中小规模集群之rsync数据同步备份
    Python开发【第七篇】:面向对象二
    批量管理
    inotify
    Python开发【第六篇】:面向对象
    网络文件系统NFS
    Linux基础介绍【第九篇】
    Linux基础介绍【第八篇】
    Linux基础介绍【第七篇】
  • 原文地址:https://www.cnblogs.com/youmi/p/4516898.html
Copyright © 2011-2022 走看看