观察到数据范围非常大,然后要求最少的月份。
二分枚举大难,那么如果我们要砍一棵树,显然等到我们枚举的月数在砍贡献是最大的。
二分的范围不要打10^18,我们可以预处理最多需要砍多少个月。
所以暴力check即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200010;
typedef long long ll;
ll mymax(ll x,ll y){return x>y?x:y;}
ll a[maxn],h[maxn];
ll S,L; int n;
bool check(ll mid)
{
ll sum=0;
for(int i=1;i<=n;i++)
{
if(h[i]+mid*a[i]>=L) sum+=h[i]+mid*a[i];
if(sum>=S){return true;}
}
return false;
}
int main()
{
scanf("%d%lld%lld",&n,&S,&L);
for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
ll R=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
R=mymax(R,(mymax(S,L)-h[i])/a[i]+1);
}
ll l=0,r=R,ans=0;
while(l<=r)
{
ll mid=(l+r)/2;
if(check(mid)) {ans=mid;r=mid-1;}
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}