用了二分+模拟队列,这个方法比较复杂
#include<iostream>
using namespace std;
int sum[100002];
int que[100002];
int main()
{
int Max,tt=1;
int t,n,m,i,tail,st,en,mm1,mm2;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&m);
sum[i]=sum[i-1]+m;
}
Max=-99999999;
tail=0;
for(i=1;i<=n;i++)
{
if(sum[que[tail]]>=sum[i-1]&&tail>0)
{
st=0;
en=tail;
while(st<en)
{
int min=(st+en)/2;
if(sum[que[min]]>sum[i-1])
{
en=min;
}
else
{
st=min+1;
}
}
if(st==0) st=1;//这里注意啦
if(que[st]!=sum[i-1])
{
que[st]=i-1;
}
tail=st;
}
else
{
que[++tail]=i-1;
}
if((sum[i]-sum[que[1]])>Max)
{
Max=sum[i]-sum[que[1]];
mm1=que[1]+1;
mm2=i;
}
}
if(tt-1)
{
putchar('\n');
}
printf("Case %d:\n%d %d %d\n",tt++,Max,mm1,mm2);
}
return 0;
}