奶牛在熊大妈的带领下排成了一条直队。
显然,不同的奶牛身高不一定相同……
现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A、B奶牛相同。问这样的奶牛最多会有多少头?
从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1)。【输入格式】
第一行一个数N (2≤N≤100000),表示奶牛的头数。
接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1≤身高= maxlongint)。
【输出格式】
一行,表示最多奶牛数。
【样例输入】
5 1 2 3 4 1
【样例输出】
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; }