题意
给你一个数组,让你求两个不相交的区间,区间的长度是K,求两个区间的和的最大值。
思路
首先我们很容易的想到用前缀和来优化,然后两层循环来枚举分别找两个最大值,时间复杂度是o(n^2),因为n的数据是2e5,肯定是会超时的,所以我们还需要进一步优化。
我们可以用一个maxx[i],来表示i~n中的每个区间长度是K的最大值。
maxx[i]=max(maxx[i+1],sum[i+k-1]-sum[i-1]);
这样我们就可以一层循环,从前往后枚举每一个K的区间,然后再用maxx[i]求出后面区间的最大值,就可以o(n)复杂度的解决这个问题了。
需要注意一点的是,我们需要给maxx[i]初始化为很小的值,本来我给它初始化为-1e9,发现过了83%的样例。
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
ll maxx[N];
ll sum[N];
ll a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=1 ; i<=n ; i++) maxx[i]=-9223372036854775807;
for(int i=1 ; i<=n ; i++) cin>>a[i];
for(int i=1 ; i<=n ; i++) sum[i]=sum[i-1]+a[i];
for(int i=n-k+1 ; i>=1 ; i--)
{
maxx[i]=max(maxx[i+1],sum[i+k-1]-sum[i-1]);
}
ll ans=-9223372036854775807;
for(int i=k ; i<=n-k ; i++)
{
ans=max(ans,sum[i]-sum[i-k]+maxx[i+1]);
}
cout<<ans<<endl;
}
return 0;
}