利用前缀和去求区间的和,然后不断的去更新最大区间和,和最大的两个区间的和。
#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;
}
京公网安备 11010502036488号