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
如果ans1则说明r_idl_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;
}