前缀和与后缀和处理一下就行,然后枚举O(N)复杂度。
#include<iostream>
#include<cmath>
using namespace std;
int a[100005]={0},b[100005]={0},sumq[100005]={0},sumh[100005]={0},i,j,sum[100005]={0},maxn=0;
int main(){
int n,k;
cin>>n>>k;
for(i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
for(i=1;i<=n;i++)
{
cin>>b[i];
}
for(i=1;i<=n;i++)
if(b[i]) sumq[i]=sumq[i-1]+a[i];
else sumq[i]=sumq[i-1];
for(i=n;i>=1;i--)
if(b[i]) sumh[i]=sumh[i+1]+a[i];
else
sumh[i]=sumh[i+1];
for(i=k;i<=n;i++){
maxn=max(maxn,sumq[i-k]+sum[i]-sum[i-k]+sumh[i+1]);
}
cout<<maxn<<endl;
return 0;
}