1≤n≤200000 1≤S,L≤1018,1≤Hi,Ai≤109
二分搜索满足最大的月份
首先二分的右区间最大值不能为1e18,会在后面相乘越界。
可以找到树木可以生长到最大的月份(到这个月份必定满足,即最短的树都满足条件)即可
注意:long long
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
using namespace std;
int main(){
long long n,s,l;
scanf("%lld%lld%lld",&n,&s,&l);
static long long a[200000+10];
long long ffz=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(a[i]>=l) ffz+=a[i];
}
static long long h[200000+10];
for(int i=1;i<=n;i++){
scanf("%lld",&h[i]);
}
if(ffz>=s){
cout<<0<<endl;
return 0;
}
long long zuo=1,you=0;
for(int i=1;i<=n;i++){
you=max(you,max((s-a[i])/h[i]+1,(l-a[i])/h[i]+1));
}
long long mid=0;
long long out=0;
while(zuo<=you){
mid=(zuo+you)/2;
// cout<<mid<<endl;
int flag=0;
long long sum=0;
for(int i=1;i<=n;i++){
if(a[i]+mid*h[i]>=l){
sum+=a[i]+mid*h[i];
if(sum>=s){
flag=1;
out=mid;
you=mid-1;
break;
}
}
}
if(flag==0) zuo=mid+1;
}
cout<<out<<endl;
return 0;
}