题目大意:给定n个元素,围成一圈,问最大k个连续的元素之和最大是多少;
题目解析:很简单先想到前缀和sum[i]-sum[j],那么i确定的时候,就只需要sum[j]的最小值了,用单调队列来做;
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 200010;
const int inf = 0x3fffffff;
int s[200010];
int q[200010];
int num[200010];
int main()
{
int n,k,ans,head,tail,ss,f,Case;
scanf("%d",&Case);
while(Case--)
{
scanf("%d%d",&n,&k);
s[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
s[i]=s[i-1]+num[i];
}
for(int i=n+1;i<=n+k-1;i++)
s[i]=s[i-1]+num[i-n];
ans=-inf,head=0,tail=0,f=1,ss=1;
for(int i=1;i<=n+k-1;i++)
{
while(head<tail&&s[i-1]<s[q[tail - 1]] ) tail--;
while(head<tail&&i-q[head]>k) head++;
q[tail++]=i-1;
if(s[i] - s[q[head]]>ans)
{
ans=s[i]-s[q[head]];
f=q[head]+1;
ss=i;
}
}
if(ss>n) ss-=n;
printf("%d %d %d\n",ans,f,ss);
}
return 0;
}