双指针 前缀和
一眼双指针,注意一点就是,如果j在k处开始满足条件那么k-n的j都可以取不然你也会wa一下~~
所以再维护一个后缀最大的就好了
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6+10;
int n,k;
int w[N];
ll d[N];
ll a[N];
ll d1[N];
void solve()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>w[i];
a[i]=w[i]+a[i-1];
}
for(int i=1;i<=n;i++){
cin>>d[i];
d[i]+=d[i-1];
}
ll t = d[n];
for(int i=n;i>=1;--i){
t = max(t,d[i]);
d1[i] = t;
}
ll ans = -1e15;
for(int i=1,j=1;i<=n;i++){
while(a[j]-a[i-1]<k&&j<=n)++j;
if(a[j]-a[i-1]>=k)ans = max(ans,d1[j]-d[i-1]);
}
cout<<ans<<"\n";
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _;_ = 1;
while(_--)solve();
}