UvaLive 6531 Go up the ultras

來源:互聯網
上載者:User

標籤:rmq   dp   閱讀題   

連結:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4542

題意:有N個山峰,(N<=10^5),每個山峰有高度h,對應著每個山峰有一個d值,每個山峰到所有其他的嚴格比它高的山峰都會經過一個最低值(山穀),d代表是h減去這些最低值中的最大值的差(如果不存在比它高的山峰那麼d就是它本身的高度),問有多少山峰的d>=150000米。

思路:題讀起來還是蠻有難度的,對于山峰p,題目所要求的d的值所需要的最高的山穀一定出現在這p與和它相鄰的兩個比它高的山峰之間。這樣問題就轉化成了確定兩邊第一個比它高的山峰,並找到這兩個之間的最小值(山穀)。找到第一個比它高的山峰用dp,詢問最小值用rmq。

代碼:

#include <algorithm>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <ctype.h>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>#define eps 1e-8#define INF 0x7fffffff#define maxn 100005#define PI acos(-1.0)#define seed 31//131,1313#define lson i<<1,l,mid#define rson i<<1|1,mid+1,rtypedef long long LL;typedef unsigned long long ULL;using namespace std;int val[maxn*4],aa[maxn];int t;void build(int i,int l,int r){    if(l==r)    {        scanf("%d",&val[i]);        aa[l]=val[i];        return ;    }    int mid=(l+r)>>1;    build(lson),build(rson);    val[i]=min(val[i<<1],val[i<<1|1]);}int query(int i,int l,int r,int q_l,int q_r){    if(q_l<=l&&r<=q_r) return val[i];    int mid=(l+r)>>1;    if(q_r<=mid) return query(lson,q_l,q_r);    else if(q_l>mid) return query(rson,q_l,q_r);    else return min(query(rson,mid+1,q_r),query(lson,q_l,mid));}int L[maxn],R[maxn];void init(){    memset(L,0,sizeof(L));    memset(R,0,sizeof(R));    memset(aa,-1,sizeof(aa));    memset(val,0,sizeof(val));    build(1,1,t);}int main(){    while(~scanf("%d",&t))    {        init();        L[1]=0;        for(int i=2; i<=t; i++)        {            if(aa[i-1]>aa[i])                L[i]=i-1;            else            {                int from=i-1;                while(aa[i]>=aa[L[from]]&&from!=0)                    from=L[from];                L[i]=from;            }        }        R[t]=t+1;        for(int i=t-1;i>=1;i--)        {            if(aa[i+1]>aa[i])                R[i]=i+1;            else            {                int from=i+1;                while(aa[i]>=aa[R[from]]&&from!=t+1)                    from=R[from];                R[i]=from;            }        }        bool flag=0;        for(int i=1; i<=t; i++)        {            int res=-1;            if(query(1,1,t,L[i],i)>res&&L[i]!=0)                res=query(1,1,t,L[i],i);            if(query(1,1,t,i,R[i])>res&&R[i]!=t+1)                res=query(1,1,t,i,R[i]);            if((res==-1&&aa[i]>=150000)||(aa[i]-res>=150000))            {                if(flag==0)                {                    printf("%d",i);                    flag = 1;                }                else printf(" %d",i);            }        }        printf("\n");    }    return 0;}


UvaLive 6531 Go up the ultras

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.