码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj2096] [Poi2010]Pilots

时间:2016-06-18 16:44:26      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

  对于合法区间的左右端点l,r,显然最左的l随着r增加而不减。

  对于最大值和最小值分别维护一个单调队列,如果非法就挪l并出队。

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int maxn=3000233;
 8 int mx[maxn],mn[maxn],id1[maxn],id2[maxn],l1,r1,l2,r2;
 9 int i,j,k,n,m,x,ans,K,l;
10  
11 int ra;char rx;
12 inline int read(){
13     rx=getchar(),ra=0;
14     while(rx<0||rx>9)rx=getchar();
15     while(rx>=0&&rx<=9)ra*=10,ra+=rx-48,rx=getchar();return ra;
16 }
17 inline int getdelta(int l){
18     while(l1<r1&&id1[l1]<l)l1++;
19     while(l2<r2&&id2[l2]<l)l2++;
20     return mx[l1]-mn[l2];
21 }
22 inline int max(int a,int b){return a>b?a:b;}
23 int main(){
24     K=read(),n=read();
25     l=l1=l2=1,r1=r2=0;
26     for(i=1;i<=n;i++){
27         x=read();
28         while(l1<=r1&&mx[r1]<=x)r1--;
29         while(l2<=r2&&mn[r2]>=x)r2--;
30         mx[++r1]=mn[++r2]=x,id1[r1]=id2[r2]=i;
31         while(l<i&&getdelta(l)>K)l++;
32 //      printf("  %d--%d\n",l,i);
33         ans=max(ans,i-l+1);
34     }
35     printf("%d\n",ans);
36 }
37 
View Code

 

[bzoj2096] [Poi2010]Pilots

标签:

原文地址:http://www.cnblogs.com/czllgzmzl/p/5596390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!