不出意外,这回又当孙子了(悲
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
long long arr[100001];
long long mark[100001];
int main(){
int n,k;cin>>n>>k;
for (int i=1;i<=n;i++){
cin>>arr[i];
}
for (int i=1;i<=n;i++){
cin>>mark[i];
}
for (int i=1;i<=n;i++){
mark[i]=mark[i-1]+mark[i]*arr[i];
}
for (int i=2;i<=n;i++){
arr[i]=arr[i-1]+arr[i];
}
ll max=0,sum=0;
for (int i=1;i<=n-k;i++){
sum=arr[i+k-1]-arr[i-1]+mark[n]-(mark[i+k-1]-mark[i-1]);
if (max<sum)
max=sum;
}
cout<<max;
}
/*
4 3
10 5 4 7
0 1 1 0
19
3 1
2 5 4
0 0 1
9
*/
思路很简单,就是两次前缀和,为了节省空间,对自身进行求前缀和
总结:
1.long long
2.long long x=INT_MIN,这是哪个智障想出的睿智写法(
3.前缀和,和差分,最好从下标1开始读入数据,下标0则为0,好处:Sn-Sn-1可以表示出a0,一个一个一个通用公式