bzoj2096: [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),表示难度序列。

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

by poi

题解:
http://hzwer.com/5235.html
code:
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 char ch;
 8 bool ok;
 9 void read(int &x){
10     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
11     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
12     if (ok) x=-x;
13 }
14 const int maxn=3000005;
15 int k,n,v,hmin,tmin,hmax,tmax,ans,last;
16 struct Data{
17     int val,id;
18 }qmin[maxn],qmax[maxn];
19 int main(){
20     read(k),read(n);
21     hmin=hmax=1,tmin=tmax=0,last=1;
22     for (int i=1;i<=n;i++){
23         read(v);
24         while (hmin<=tmin&&qmin[tmin].val>v) tmin--;
25         qmin[++tmin]=(Data){v,i};
26         while (hmax<=tmax&&qmax[tmax].val<v) tmax--;
27         qmax[++tmax]=(Data){v,i};
28         while (hmin<=tmin&&hmax<=tmax&&qmax[hmax].val-qmin[hmin].val>k)
29             if (qmax[hmax].id<qmin[hmin].id) last=qmax[hmax++].id+1;
30             else last=qmin[hmin++].id+1;
31         ans=max(ans,i-last+1);
32     }
33     printf("%d
",ans);
34     return 0;
35 }
原文地址:https://www.cnblogs.com/chenyushuo/p/5252043.html