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