题目链接

思路:一个很显然的暴力做法是 枚举两个不相交的区间取一个最大值。
显然会得到TLE。
稍加思索可以发现,我们可以预处理一个数组,意味 右端点在范围内的权值和最大的一段的权值和。
然后枚举第二段的右端点,然后答案显然就可以通过取最大值计算出来了。
小细节是 初始要赋值为极小值,和初始化一下前缀和。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
int t,n,k,a[N];
LL s[N],pre[N];
int main() {
  ios::sync_with_stdio(false);
  for(cin>>t;t;t--){
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i],s[i]=s[i-1]+a[i];
    pre[k-1]=-1e18;
    for(int i=k;i<=n;i++){
      pre[i]=max(s[i]-s[i-k],pre[i-1]);
    }
    LL ans=-1e18;
    for(int i=2*k;i<=n;i++){
      ans=max(ans,pre[i-k]+s[i]-s[i-k]);
    }
    cout<<ans<<'\n';
  }
  return 0;
}