https://www.acwing.com/solution/content/59525/
//双指针
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,k;
cin>>n>>k;
vector<long long> a(n);
vector<long long> b(n);
for(long long i = 0 ; i < n ; i++){
cin>>a[i];
}
for(long long j = 0 ; j < n ;j++){
cin>>b[j];
}
long long sum = 0;
for(long long i = 0 ; i < k ; i++){
if(!b[i]) sum += a[i];
}
long long total = sum;
for(long long i = 0,j = k;j < n;i++,j++){
if(!b[i]) sum -= a[i];
if(!b[j]) sum += a[j];
total = max(total,sum);
}
for(long long q = 0;q < n;q++){
if(b[q]) total += a[q];
}
cout<<total;
}
//前缀和
// 首先,c[i]表示的是从第一个位置到第i个位置的不可选元素的前缀和。
// 假设我们有数组c,其下标从0开始,且c[i]是前i个位置中不可选元素的总和。
// 那么c[i - k]就表示前i - k个位置中不可选元素的总和。
// 当我们用c[i] - c[i - k]时:
// c[i]包括了从第一个位置到第i个位置的不可选元素总和。
// c[i - k]包括了从第一个位置到第i - k个位置的不可选元素总和。
// 用c[i]减去c[i - k],就相当于把前i - k个位置的不可选元素总和给去掉了,剩下的就是从第i - k + 1个位置到第i个位置这个长度为k的区间内不可选元素的总和。
#include <iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
long long c[N]; //存前缀和,开long long,防止爆int
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
long long d=0,res=0;
for(int i=1;i<=n;i++)
{
c[i]=c[i-1]; //先把上一个前缀和copy过来
if(!b[i]) c[i]+=a[i]; //如果这个不可选就加上,可选就不用管
if(b[i]) d+=a[i]; //累加可选值
if(i>=k) res=max(res,c[i]-c[i-k]); //找最大值
}
cout<<res+d;
return 0;
}