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
如果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;
}

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