题意大致为求两个长度为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);
}
}

京公网安备 11010502036488号