题意大致为求两个长度为k的区间和最大,如果枚举第一个区间的起点L1,则只需要在[L1+k,n-k+1]中找一个位置X满足[X,X+k-1]的和最大。
所以可以预处理:sum[i]表示[i,i+k-1]的值,Max[i]表示[i,n-k+1]中的sum最大值。最后枚举起点L1,则答案为max(sum[L1]+Max[L1+k])
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2e5+10; const ll inf = 1e18; ll a[maxn],p[maxn],Max[maxn]; int main(){ int t; scanf("%d",&t); while(t--){ int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); p[i]=0; Max[i]=-inf; } for(int i=1;i<=k;i++) p[1]+=a[i]; for(int i=2;i<=n-k+1;i++) p[i]=p[i-1]+a[i+k-1]-a[i-1]; for(int i=n-k+1;i>=1;i--) Max[i]=max(Max[i+1],p[i]); ll ans =-inf; for(int i=1;i<=n-2*k+1;i++) ans =max(ans,p[i]+Max[i+k]); printf("%lld\n",ans); } }