您的位置:首页 > 其它

BZOJ 2096: [Poi2010]Pilots

2016-02-08 17:11 405 查看
单调队列。

维护两个单调队列,一个难度递增,另一个递减。

当两个队头的差大于K时,较左的出队,队中元素最左变为出队元素位置+1;

。。这么说好像很拗口。。还是看代码吧。。。

代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<deque>
#define ll long long
#define inf 0x7fffffff
#define g getchar()
#define maxn 3000100
using namespace std;
inline int read(){
int x=0,f=1;char ch;
for(ch=g;ch>'9'||ch<'0';ch=g){if(ch=='-')f=-1;}
for(;ch>='0'&&ch<='9';ch=g){x=x*10+ch-'0';}
return x*f;
}
inline int max(int x,int y){
return x>y?x:y;
}
int k,n,ans;
int a[maxn],dui1[maxn],dui2[maxn];

void init(){
k=read();n=read();
for(int i=1;i<=n;++i)a[i]=read();
a[n+1]=inf;
}
void work(){
int t=1,l1=1,l2=1,r1=0,r2=0;
for(int i=1;i<=n;++i){
for(;l1<=r1&&a[dui1[r1]]<=a[i];--r1);
for(;l2<=r2&&a[dui2[r2]]>=a[i];--r2);
dui1[++r1]=i;dui2[++r2]=i;
for(;a[dui1[l1]]-a[dui2[l2]]>k;t=dui1[l1]<dui2[l2]?dui1[l1++]+1:dui2[l2++]+1);
ans=max(ans,i-t+1);
}
}
int main(){
init();
work();
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: