题目
题解思路
用双指针维护大小为k的区间即可,暴力往回走直接TLE。
100000个 10000时爆int
答案数据范围大于int 用long long 。
很简单的双指针,写错那么多次,都是自己太急,写了不少错误,没认真考虑。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
int a[100010];
int p[100010];
int main ()
{
int n,k;
long long ans = 0;
cin>>n>>k;
for (int i = 0 ; i < n ; i++ )
scanf("%d",&a[i]);
for (int i = 0 ; i < n ; i++ )
{
scanf("%d",&p[i]);
if ( p[i] == 1 )
ans += a[i];
}
long long pit = 0, p1 = 0 , tmp = 0 ;
for (int i = 0 ; i < k ; i++ )
if ( p[i] == 0 )
tmp += a[i];
pit = tmp ;
for (int i = k ; i < n ; i++ )
{
if ( p[p1] == 0 )
tmp -= a[p1];
p1++;
if ( p[i] == 0 )
tmp += a[i];
pit = max(pit,tmp);
}
printf("%lld\n",pit+ans);
return 0;
}