记录编号 |
46557 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2010冲刺十二]奶牛排队 |
最终得分 |
100 |
用户昵称 |
kaaala |
是否通过 |
通过 |
代码语言 |
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;
}