传送门
思路:状态和价值分别求一次前缀和即可。
#include<iostream>
#include<set>
using namespace std;
string s;
set<char>st;
long long f[100005];
long long v[100005], s1[100005], s2[100005];
int n, m;
// sum = 0;
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> v[i];
s1[i] = s1[i - 1] + v[i];
// sum += v[i];
}
for(int i = 1; i <= n; i++)
cin >> f[i];
for(int i = 1;i <= n;i++)
{
if(f[i])
s2[i] = s2[i - 1] + v[i];
else
s2[i] = s2[i - 1];
}
int i = 0;
long long ans = 0;
while(i + m <= n)
{
ans = max(s1[i + m] - s1[i] + s2[i] + s2[n] - s2[i + m], ans);
i++;
}
cout << ans << endl;
return 0;
}