bzoj2096[Poi2010]Pilots 单调队列

Posted wsy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于bzoj2096[Poi2010]Pilots 单调队列的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2096: [Poi2010]Pilots

单调队列 BZOJ 2096 [Poi2010]Pilots

bzoj2096[Poi2010]Pilots 单调队列

[bzoj2096] [Poi2010]Pilots

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

刷题BZOJ 2096 [Poi2010]Pilots