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;
}
维护两个单调队列,一个难度递增,另一个递减。
当两个队头的差大于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;
}
相关文章推荐
- 【深度】20年,中国互联网主流产品的演变和逻辑
- eclipse 交叉编译unresolved inclusion:<stdio.h>问题
- NYOJ 题目68 三点顺序
- 有意思的数学题:Trapping Rain Water
- 建筑图纸符号大全
- 2015年终总结
- Caffe使用教程
- BZOJ 1305: [CQOI2009]dance跳舞
- 怎么读Man Page和BNF
- abstract 抽象类
- ADO.NET之存储图片路径
- 两种不同刷新和显示,有待研究
- 【翻译自mos文章】在windows平台上怎么启用Oracle database 企业版的partition?
- VS2013 更改MFC标题栏图标和生成的执行文件图标
- restlet 2.3.5 org.restlet包导入eclipse出现的com.sun.net.httpserver类包找不到问题
- C printf() 详解——printf('%08x',number); 程序员面试宝典中的一个错误 char * b=(char *)&a
- 先有Delphi内存对象,后有句柄(如果需要的话),最后再显示
- 20160205交易记录
- Java Web 错误/异常处理页面
- iOS 基础题