思路:一个很显然的暴力做法是 枚举两个不相交的区间取一个最大值。
显然会得到TLE。
稍加思索可以发现,我们可以预处理一个数组,意味 右端点在
范围内的权值和最大的一段的权值和。
然后枚举第二段的右端点,然后答案显然就可以通过取最大值计算出来了。
小细节是 初始要赋值为极小值,和初始化一下前缀和。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 2e5 + 10; #define fi first #define se second #define pb push_back int t,n,k,a[N]; LL s[N],pre[N]; int main() { ios::sync_with_stdio(false); for(cin>>t;t;t--){ cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i],s[i]=s[i-1]+a[i]; pre[k-1]=-1e18; for(int i=k;i<=n;i++){ pre[i]=max(s[i]-s[i-k],pre[i-1]); } LL ans=-1e18; for(int i=2*k;i<=n;i++){ ans=max(ans,pre[i-k]+s[i]-s[i-k]); } cout<<ans<<'\n'; } return 0; }