
#include<stdio.h>
int main()
{
long long a[100001]={0},n,M=0,m=0,F=0,X=0,H=0,h=0;
int T,i;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
H=H+a[i];
}
for(i=1;i<n;i++)
{
if(a[i]>a[X])
X=i;
}
h=a[X];
M=a[0];
for(i=1;i<=X;i++)
{
if(a[i]>=M)
{
h=h+M*(i-F);
F=i;
M=a[i];
}
}
m=a[n-1];
F=n-1;
for(i=n-2;i>=X;i--)
{
if(a[i]>=m)
{
h=h+(F-i)*m;
F=i;
m=a[i];
}
}
printf("%lld\n",h-H);
M=0,m=0,F=0,H=0,h=0,X=0;
}
}
该代码片段是一个C++程序,用于解决计算给定数组中最大连续子数组的和问题。通过两次遍历找到左端点和右端点,计算子数组和并更新最大和。
233

被折叠的 条评论
为什么被折叠?



