WOJ1109 奶牛排队

Posted kma093

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WOJ1109 奶牛排队相关的知识,希望对你有一定的参考价值。

题目链接:

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 奶牛排队的主要内容,如果未能解决你的问题,请参考以下文章

奶牛排队

UOJ 281排队布局

Bzoj1731 排队布局

笔试算法题目,奶牛排队喝水

笔试算法题目,奶牛排队喝水

高手训练RMQ奶牛排队