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
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
题解:
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\n",ans); 34 return 0; 35 }