注意数据范围;首先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; } }