https://www.matiji.net/exam/brushquestion/17/4498/F16DA07A4D99E21DFFEF46BD18FF68AD
二分思路不難,關鍵的區間內個數的確定
#include<bits/stdc++.h>
using namespace std;
#define N 100011
#define inf 0x3f3f3f3f
typedef long long ll;
typedef pair<int,int> pii;
ll n,l,r,c;
ll mid,an;
ll a[N],b[N];
ll sl,sr;
bool check(ll x)
{ll cc=0;for(int i=1;i<=n;i++){if(x<b[i]) continue;if(b[i]<sl){ll l1=(sl-b[i]-1)/a[i];///這里非常巧妙,可能是與區間開閉有關 ll r1=(x-b[i])/a[i];cc+=(r1-l1); if(cc>=c) return true;}else{ll r1=(x-b[i])/a[i];cc+=r1+1;if(cc>=c) return true;}}return false;
}
void solve() {cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];cin>>l>>r>>c;sl=l,sr=r;while(l<=r){ll mid=(l+r)>>1;if(check(mid)){an=mid;r=mid-1;}else l=mid+1;}if(an<sr&&check(an)) cout<<an;else cout<<-1;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}