大多数人用的前缀和+dp
由于是两个区间,我们可以把这个区间分开。
第一个区间一直找最大值,然后紧接着第一个区间的下一个找最大值
然后计算两个 相加的最大值。
相当于遍历了所有长度为k的区间。只是固定了第一组在第二组前边(因为是连续的)。

#include<iostream>
#include<climits>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int t,n,k;
ll a[maxn];
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n>>k;
        a[0]=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            a[i]+=a[i-1]; //计算前缀和
        }
        ll ans=INT_MIN,before=INT_MIN;
        for(int i=k;i+k<=n;i++){
            before=max(before,a[i]-a[i-k]); //计算第一组的最大值
            ans=max(ans,before+a[i+k]-a[i]);//第二组的最大值在第一组后边,当第一组找到最大后,依次找第二组的最大值
        }cout<<ans<<endl;
    }
    return 0;
}