注意数据范围;首先n^2超时,所以最少nlogn,但是看题目,感觉不需要数据结构优化;
所以可能是n的复杂度,区间修改,前缀和。同时注意数据初始化;
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f3f3f3f;
signed main()
{
int t,n,k,sum[210000],g[210000],a[210000],h[210000];
cin>>t;
while(t--)
{
cin>>n>>k;
int ans=-1000000000000000000;//a的取值范围负数范围也有,所以sum可能为负
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
memset(g,-inf,sizeof(g));//记录前缀和
memset(h,-inf,sizeof(h));//记录后缀和
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
if(i>=k&&i<=n-k)
{
g[i]=max(g[i-1],sum[i]-sum[i-k]);//区间为k的最大前缀和
}
}
for(int j=n;j>=1;j--)
{
if(j<=n-k+1&&j>=k-1){
h[j]=max(h[j+1],sum[j+k-1]-sum[j-1]);//区间为k的最大后缀和
}
}
for(int i=k;i<=n-k;i++)
ans=max(ans,g[i]+h[i+1]);//枚举区间左右分割的边界
cout<<ans<<endl;
}
}
京公网安备 11010502036488号