标签:
对于合法区间的左右端点l,r,显然最左的l随着r增加而不减。
对于最大值和最小值分别维护一个单调队列,如果非法就挪l并出队。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define ll long long 6 using namespace std; 7 const int maxn=3000233; 8 int mx[maxn],mn[maxn],id1[maxn],id2[maxn],l1,r1,l2,r2; 9 int i,j,k,n,m,x,ans,K,l; 10 11 int ra;char rx; 12 inline int read(){ 13 rx=getchar(),ra=0; 14 while(rx<‘0‘||rx>‘9‘)rx=getchar(); 15 while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra; 16 } 17 inline int getdelta(int l){ 18 while(l1<r1&&id1[l1]<l)l1++; 19 while(l2<r2&&id2[l2]<l)l2++; 20 return mx[l1]-mn[l2]; 21 } 22 inline int max(int a,int b){return a>b?a:b;} 23 int main(){ 24 K=read(),n=read(); 25 l=l1=l2=1,r1=r2=0; 26 for(i=1;i<=n;i++){ 27 x=read(); 28 while(l1<=r1&&mx[r1]<=x)r1--; 29 while(l2<=r2&&mn[r2]>=x)r2--; 30 mx[++r1]=mn[++r2]=x,id1[r1]=id2[r2]=i; 31 while(l<i&&getdelta(l)>K)l++; 32 // printf(" %d--%d\n",l,i); 33 ans=max(ans,i-l+1); 34 } 35 printf("%d\n",ans); 36 } 37
标签:
原文地址:http://www.cnblogs.com/czllgzmzl/p/5596390.html