[bzoj2096] [Poi2010]Pilots

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj2096] [Poi2010]Pilots相关的知识,希望对你有一定的参考价值。

  对于合法区间的左右端点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的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2096: [Poi2010]Pilots

单调队列 BZOJ 2096 [Poi2010]Pilots

bzoj2096[Poi2010]Pilots 单调队列

BZOJ2096[Poi2010]Pilots 双指针+单调队列

[bzoj2096] [Poi2010]Pilots

刷题BZOJ 2096 [Poi2010]Pilots