题目链接
(我一直以为自己以前没写过单调队列的题来着)话说这题是出到树状数组练习题里的,我却写了个单调队列……
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+5;
struct node{
int x,id;
bool operator < (const struct node&b)const{
return (x==b.x&&id<b.id)||x<b.x;
}
}a[N];
int q[N];//单调队列
ll sum[N];//前缀和
int main()
{
//freopen("in.txt","r",stdin);
int t,ca;
scanf("%d",&t);
for(ca=1;ca<=t;ca++)
{
memset(sum,0,sizeof(sum));
memset(q,0,sizeof(q));
int n,p,k,rt=-1;
scanf("%d%d%d",&n,&p,&k);//n袋,p单位,不超过k单位
for(int i=1;i<=n;i++)
{
int g;
scanf("%d",&g);
sum[i]=sum[i-1]+g;//维护前缀和
a[i].id=i,a[i].x=sum[i]%p;
}
sort(a+1,a+n+1);
int hd=0,tl=0;
q[tl++]=0;
for(int l=1;l<=n;l++)
{
while(hd<tl&&a[l].x-a[q[hd]].x>k)++hd;
while(hd<tl&&a[l].id<a[q[tl-1]].id)--tl;
if(hd<tl)
rt=max(rt,(int)((sum[a[l].id]-sum[a[q[hd]].id])/p));
q[tl++]=l;//漏了
}
printf("Case %d: %d\n",ca,rt);
}
return 0;
}