思路:
又是一个很帅的双指针,l,r
判断如何当前l,r区间内和的饱腹值和>m时,不断枚举l向右移动,移动过程选出当前1-l中的可口值的最小值(mn),如何再mmax=max(mmax,pre_d[]-mn);
具体细节看下面捏(通俗易懂)
ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,m,a[N],b[N];
void solve() {
cin>>n>>m;
for(int i=1; i<=n; ++i) {
cin>>a[i];
a[i]+=a[i-1];
}
for(int i=1; i<=n; ++i) {
cin>>b[i];
b[i]+=b[i-1];
}
int ans=-2e18,mn=2e18;
int l=0,r=1;
while(r<=n){
while(a[r]-a[l]>m){
mn=min(mn,b[l]);
l++;
}
ans=max(ans,b[r]-mn);
r++;
}
cout<<ans<<"\n";
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt=1;
//cin>>tt;
while(tt--) {
solve();
}
return 0;
}
over~