求最大不超过k的连续子序列的和 单调队列
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int num[201000],id[201000],sum[201000];
int main()
{
int n,m,i,j,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
sum[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum[i]=sum[i-1]+num[i];
}
for(i=n+1;i<=n+m;i++)
sum[i]=sum[i-1]+num[i-n];
int Max=-999999999;
int front=0,top=0,star,end;
for(i=1;i<=n+m;i++)
{
while(front<top&&sum[i-1]<sum[id[top-1]])
top--;
id[top++]=i-1;
while(i-id[front]>m&&front<top)
front++;
if(sum[i]-sum[id[front]]>Max)
{
star=id[front]+1;
end=i;
Max=sum[i]-sum[id[front]];
}
}
if(star>n) star%=n;
if(end>n) end%=n;
printf("%d %d %d\n",Max,star,end);
}
return 0;
}