利用前缀和去求区间的和,然后不断的去更新最大区间和,和最大的两个区间的和。

图片说明

#include <iostream>
#define Min 0x80000000
#include <cstring>
#define N 200006
using namespace std;

long long a[N];
int n,m;

long long MAX(){
    long long Max = Min,ans = Min;
    for(int i = m; i + m <= n; i++){
        Max = max(Max,a[i] - a[i-m]);
        ans = max(ans,Max + a[i+m] - a[i]);
    }

    return ans;
}

int main(){
    int t;
    cin >> t;
    while(t--){
        memset(a,0,sizeof(a));
        cin >> n >> m;
        for(int i = 1; i <= n; i++){
            cin >> a[i],a[i] += a[i-1];
        }
        cout << MAX() << endl;
    }

    return 0;
}