一道裸的单调队列,每次把一个数加进单调队列,将队列头不符合要求的弹出队列,维护这个过程中的一个最大值。

1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int t,n,m; 5 int a[1000010]; 6 int q[1000010]; 7 int main(){ 8 scanf("%d",&t); 9 for(int ca=1;ca<=t;ca++){ 10 scanf("%d%d",&n,&m); 11 for(int i=0;i<n;i++) scanf("%d",&a[i]); 12 if(n==0) {cout<<0<<endl;continue;} 13 int head=0,tail=0; 14 q[tail++]=a[0]; 15 int ans=1; 16 ans=max(ans,1+m); 17 for(int i=1;i<n;i++){ 18 q[tail++]=a[i]; 19 while(q[tail-1]-q[head]+1-(tail-1-head+1)>m) head++; 20 ans=max(ans,q[tail-1]-q[head]+1+m-(q[tail-1]-q[head]-(tail-1-head))); 21 } 22 printf("%d ",ans); 23 } 24 return 0; 25 }