BUAA 735 晴天小猪来刷人人

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

 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 }
BUAA 735

 

原文地址:https://www.cnblogs.com/wonderzy/p/3463165.html