题目链接
题意大致为求两个长度为$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 ",ans); } }