码迷,mamicode.com
首页 > 其他好文 > 详细

WOJ1109 奶牛排队

时间:2019-01-19 19:57:15      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:inline   long   max   更新   struct   int   bit   space   line   

题目链接:

WOJ1109

题目描述:

奶牛在熊大妈的带领下排成了一条直队。 显然,不同的奶牛身高不一定相同…… 现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,且中间如果存在奶牛,则身高不能和A、B奶牛相同,的这样的一些奶牛最多会有多少头。 从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0、2,但不会是1)。

输入
第一行一个数N(2<=N<=100000),表示奶牛的头数。 接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1<=身高<=maxlongint)。

输出
一行,表示最多奶牛数。

分析:

维护一个单减的单调栈,读入一个数x时,如果单调栈顶的数比x更小,就弹出这个数(设为xi),而如果x当前可延伸的左端点值比xi的左端点值更大,就用xi可以延伸到的最左端的端点更新x的最左端的端点(值和编号都要更新)(xi<x,所以xi如果能延伸到左端点xj,则x一定也能延伸到左端点j)弹完压入x并更新ans=r_id-l_id+1
如果ans==1则说明r_id==l_id,这种情况是不合法的(相当于A==B),把ans更改为0
输出ans


代码:

#include<bits/stdc++.h>
#define MAXN (100000+5)
using namespace std;
inline int read(){
    int f=1,cnt=0;char c;
    c=getchar();
    while(!isdigit(c)){if(c==‘-‘)f=-f;c=getchar();}
    while(isdigit(c)){cnt=cnt*10+c-‘0‘;c=getchar();}
    return cnt*f;
}
struct node{int ldat;int rdat;int lid;int rid;}sta[MAXN],x;
int n;
int top=0;
int ans=-1;
int main(){
    n=read();
    for(register int i=1;i<=n;i++){
        x.rdat=read();x.ldat=x.rdat;
        x.lid=x.rid=i;
        while(x.rdat>sta[top].rdat&&top){
            if(x.ldat>sta[top].ldat){
                x.ldat=sta[top].ldat;
                x.lid=sta[top].lid;
            }
            top--;
        }
        sta[++top].ldat=x.ldat;
        sta[top].rdat=x.rdat;
        sta[top].lid=x.lid;
        sta[top].rid=x.rid;
        if(ans<sta[top].rid-sta[top].lid+1)ans=sta[top].rid-sta[top].lid+1;
    }
    if(ans==1)ans=0;
    printf("%d",ans);
    return 0;
}

WOJ1109 奶牛排队

标签:inline   long   max   更新   struct   int   bit   space   line   

原文地址:https://www.cnblogs.com/kma093/p/10292900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!