这个题目有比较刁钻的数据,所以0xc0c0c00c这个极小值在用的时候会出错,所以尽量把极小值开的再小一点为好。
题解:我们可以对前缀和进行一个小小的变式。
原来的前缀和:假如我们要求l-r这个区间,那么就是sum[r]-sum[l-1]为这个区间的和,但是现在看题目来说,这个区间的长度已经定住不会再变化了,所以我们用sum[i]表示i到i+k-1这段区间的总和。
我们再用一个rmax[i]表示从i+k到n-k+1距离为k的的区间的最大值。
这样的话我们就可以在O(n)求出结果。
注意这个rmax是要倒着推出来的。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;


ll a[maxn],lsum[maxn],rmax[maxn];

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            lsum[i]=0;
            rmax[i]=-1e18;
        }
        for(int i=1;i<=k;i++) lsum[1]+=a[i];
        for(int i=2;i<=n-k+1;i++) lsum[i]=lsum[i-1]+a[i+k-1]-a[i-1];
        for(int i=n-k+1;i>=1;i--) rmax[i]=max(rmax[i+1],lsum[i]);
        ll ans=-1e18;
        for(int i=1;i<=n-2*k+1;i++){
            ans=max(ans,lsum[i]+rmax[i+k]);
        }
        cout<<ans<<endl;
    }
    return 0;
}