2096: [Poi2010]Pilots
Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 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 搞搞就好
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 }