记录编号 46557 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010冲刺十二]奶牛排队 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.154 s
提交时间 2012-10-28 16:30:31 内存使用 0.70 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<deque>

using namespace std;

int N,hight[100010],ans;
deque<int>deq[2];

int search(int u)
{
	int l=0,r=deq[1].size()-1;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		int k=*(deq[1].begin()+mid);
		if(hight[k]<hight[u])
			r=--mid;
		else
			l=mid+1;
	}
	if(r==-1)
		return 0;
	return *(deq[1].begin()+r);
}

int main()
{
	freopen("tahort.in","r",stdin);
	freopen("tahort.out","w",stdout);
	scanf("%d",&N);
	for(int i=1;i<=N;i++)
		scanf("%d",&hight[i]);
	deq[0].push_back(1);
	deq[1].push_back(1);
	for(int i=2;i<=N;i++)
	{
		int u=search(i),l;
		if(u<deq[0].back())
			l=*upper_bound(deq[0].begin(),deq[0].end(),u);
		else
			l=i+1;
		ans=max(ans,i-l+1);
		while(!deq[0].empty())
		{
			if(hight[i]>hight[deq[0].back()])
				break;
			deq[0].pop_back();
		}
		deq[0].push_back(i);
		while(!deq[1].empty())
		{
			if(hight[i]<hight[deq[1].back()])
				break;
			deq[1].pop_back();
		}
		deq[1].push_back(i);
	}
	printf("%d\n",ans);
	return 0;
}