COGS1212. 奶牛排队

来源:互联网 发布:网络电视江苏卫视直播 编辑:程序博客网 时间:2024/06/06 01:30

奶牛在熊大妈的带领下排成了一条直队。  

显然,不同的奶牛身高不一定相同……

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A、B奶牛相同。问这样的奶牛最多会有多少头?

从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1)。

【输入格式】

第一行一个数N (2≤N≤100000),表示奶牛的头数。

接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1≤身高= maxlongint)。

【输出格式】

一行,表示最多奶牛数。

【样例输入】

512341

【样例输出】

4

【提示】

样例解析,取第1头到第4头奶牛,满足条件且为最多。

题解:
维护一个单调递减的单调队列/单调栈 每次插入高度时 若队中已有高度低于这头牛的牛 就判断队中牛能向左延伸到的那头牛能否被这头牛延伸到 (特判高度相等的) 然后每个位置计算答案并更新

代码:

#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;struct statype{int bhei,bpos,ahei,apos;}sta[100010];int top=-1;int main(){freopen("tahort.in","r",stdin);freopen("tahort.out","w",stdout);int n,ans=0;cin>>n;for(int i=1;i<=n;i++){top++;cin>>sta[top].bhei;sta[top].ahei=sta[top].bhei;sta[top].bpos=i;sta[top].apos=i;while(sta[top].bhei>sta[top-1].bhei&&top>=1){if(sta[top].ahei>sta[top-1].ahei){sta[top].ahei=sta[top-1].ahei;sta[top].apos=sta[top-1].apos;}sta[top-1]=sta[top];top--;}if(ans<sta[top].bpos-sta[top].apos+1)ans=sta[top].bpos-sta[top].apos+1;}if(ans==1)ans=0;cout<<ans<<endl;return 0;}

2 0