bzoj2096[Poi2010]Pilots 单调队列

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

Sample Output

4
(有两个子串的长度为4: 5, 8, 6, 6 和8, 6, 6, 9.最长子串的长度就是4)

HINT

Source

维护两个单调队列 max min 搞搞就好

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 3000005
 6 #define ll long long
 7 using namespace std;
 8 int n,m,a[N],mx[N],mn[N];
 9 int l[]={1,1},r[]={0,0};
10
11 char gc(){
12     static char s[1000000],*p1,*p2;
13     if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
14     if(p1==p2)return EOF;
15     return *p1++;
16 }
17 int read(){
18     int x=0;char ch=gc();
19     while(ch>‘9‘||ch<‘0‘)ch=gc();
20     while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=gc();
21     return x;
22 }
23 int main(){
24     m=read();n=read();
25     for(register int i=1;i<=n;i++)a[i]=read();
26     mx[++r[0]]=1;mn[++r[1]]=1;
27     register int h=1,t=1,ans=1;
28     while(t<n){
29         t++;
30         while(l[0]<=r[0]&&a[mx[r[0]]]<=a[t])r[0]--;
31         while(l[1]<=r[1]&&a[mn[r[1]]]>=a[t])r[1]--;
32         mx[++r[0]]=t;mn[++r[1]]=t;
33         int tmp=a[mx[l[0]]]-a[mn[l[1]]];
34         while(tmp>m){
35              h++;
36              while(mx[l[0]]<h)l[0]++;
37              while(mn[l[1]]<h)l[1]++;
38              tmp=a[mx[l[0]]]-a[mn[l[1]]];
39         }
40         if(t-h+1>ans)ans=t-h+1;
41     }
42     printf("%d\n",ans);
43     return 0;
44 }

原文地址:http://www.cnblogs.com/wsy01/p/8110376.html

时间: 2024-10-12 15:36:50

bzoj2096[Poi2010]Pilots 单调队列的相关文章

2096: [Poi2010]Pilots单调队列题解

Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度.第二行为n个由空格隔开的整数ai(1<=ai<=2000,000,000),表

BZOJ 2096 Poi2010 Pilots 单调队列

题目大意:给定一个序列,求一个最长的子串,使最大值与最小值之差不超过k 从左到右枚举右端点,利用单调队列维护当前区间中的最大值和最小值 如果某一时刻当前区间的最大值和最小值之差超过了k,就向右调整左端点直到差小于等于k为止 时间复杂度O(n) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 3003003 using namespa

bzoj2096[Poi2010]Pilots*

bzoj2096[Poi2010]Pilots 题意: 给一个序列和一个最大值,要求找一个最长连续子串,使里面任意两个数相差不超过这个最大值.序列大小≤3000000 题解: 用两个单调队列,分别维护当前区间的最大值和最小值,然后用双指针法. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5

【单调队列】bzoj2096 [Poi2010]Pilots

用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; int m,n,head[2]={1,1},tail[2]={1,1},q[2][3000001],a[3000001],ans; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;++i) scanf("%

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

[BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度.第二行为n个由空格隔开的整数ai(1&

单调队列 BZOJ 2096 [Poi2010]Pilots

2096: [Poi2010]Pilots Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 819  Solved: 418[Submit][Status][Discuss] Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0

【bzoj2096】[Poi2010]Pilots 双指针法+STL-set

题目描述 Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. 输入 输入:第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz设定的最大值,n代表难度序列的长度.第二行为n个由空格隔开的整数ai(1<=ai<=2000,000,000),表示难度序列. 输出

单调队列单调栈

单调队列单调栈 Tags:数据结构 更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1041449 一.概述 单调队列单调栈是很基础的数据结构,常用来优化一些东西比如说优化DP 那么大概意思就是在栈或队列中按照某关键字单调维护信息,从而实现一些功能 其实很久之前接触过单调队列和单调栈,但一直没有刷题,趁这两天被LCT弄晕的时候复习下这些 先看题 二.题单 普及- [x] P1886 滑动窗口 https://www.luogu.org/problemnew/

【动态规划】【单调队列】tyvj1305 最大子序和

http://blog.csdn.net/oiljt12138/article/details/51174560 单调队列优化dp #include<cstdio> #include<deque> #include<algorithm> #include<iostream> using namespace std; typedef long long ll; int n,m; ll a[300100],ans; deque<int>q; int