bzoj2096[Poi2010]Pilots 单调队列
2024-10-04 02:47:47
2096: [Poi2010]Pilots
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 983 Solved: 513
[Submit][Status][Discuss]
Description
Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值。耍畸形一个人是不行的,于是他找到了你。
Input
输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度。第二行为n个由空格隔开的整数ai(1<=ai<=2000,000,000),表示难度序列。
Output
输出:最大的字串长度。
Sample Input
3 9
5 1 3 5 8 6 6 9 10
5 1 3 5 8 6 6 9 10
Sample Output
4
(有两个子串的长度为4: 5, 8, 6, 6 和8, 6, 6, 9.最长子串的长度就是4)
(有两个子串的长度为4: 5, 8, 6, 6 和8, 6, 6, 9.最长子串的长度就是4)
HINT
Source
维护两个单调队列 max min 搞搞就好
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 3000005
#define ll long long
using namespace std;
int n,m,a[N],mx[N],mn[N];
int l[]={,},r[]={,}; char gc(){
static char s[],*p1,*p2;
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
if(p1==p2)return EOF;
return *p1++;
}
int read(){
int x=;char ch=gc();
while(ch>''||ch<'')ch=gc();
while(ch>=''&&ch<='')x=x*+ch-'',ch=gc();
return x;
}
int main(){
m=read();n=read();
for(register int i=;i<=n;i++)a[i]=read();
mx[++r[]]=;mn[++r[]]=;
register int h=,t=,ans=;
while(t<n){
t++;
while(l[]<=r[]&&a[mx[r[]]]<=a[t])r[]--;
while(l[]<=r[]&&a[mn[r[]]]>=a[t])r[]--;
mx[++r[]]=t;mn[++r[]]=t;
int tmp=a[mx[l[]]]-a[mn[l[]]];
while(tmp>m){
h++;
while(mx[l[]]<h)l[]++;
while(mn[l[]]<h)l[]++;
tmp=a[mx[l[]]]-a[mn[l[]]];
}
if(t-h+>ans)ans=t-h+;
}
printf("%d\n",ans);
return ;
}
最新文章
- sphinx 增量索引 实现近实时更新
- 夺命雷公狗---linux之centos的安装
- PCB的技巧
- 在Linux下如何创建LVM及LVM创建过程
- Codeforces Round #312 (Div. 2)
- bundles.Add( )下无法绑定后缀为min.css的文件
- 查找链表中是否有环linked-list-cycle
- FFmpeg 结构体学习(二): AVStream 分析
- laravel 远程一对多实例
- Oracle 外键级联更新
- Android广播机制的基本使用
- node.js(一)
- AtCoder Grand Contest 11~17 做题小记
- python进程间通信--信号Signal
- (1.11)SQL优化——mysql提示(hint)
- day27 网络通信协议 tcp/udp区别
- Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录
- 最简单,有效的学习mysql教程(一)
- 离线微博工具Open Live Writer(Windows Live Writer)安装过程及server error 500错误解决
- 获得Azure订阅LoadBalancer的脚本