The term of this problem is the same as the previous one, the only exception — increased restrictions.
The first line contains two positive integers n and k (1 ≤ n ≤ 100 000, 1 ≤ k ≤ 109) — the number of ingredients and the number of grams of the magic powder.
The second line contains the sequence a1, a2, ..., an (1 ≤ ai ≤ 109), where the i-th number is equal to the number of grams of the i-th ingredient, needed to bake one cookie.
The third line contains the sequence b1, b2, ..., bn (1 ≤ bi ≤ 109), where the i-th number is equal to the number of grams of the i-th ingredient, which Apollinaria has.
Print the maximum number of cookies, which Apollinaria will be able to bake using the ingredients that she has and the magic powder.
1 1000000000
1
1000000000
2000000000
10 1
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000
1 1 1 1 1 1 1 1 1 1
0
3 1
2 1 4
11 3 16
4
4 3
4 3 5 6
11 12 14 20
3
这个和第一题区别并不大,只是把数据类型改一下,但是即使改成long long之后,在做运算时也要注意防止溢出(第128组样例应该就是针对数据溢出的)
#include<stdio.h>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
LL n,k,l=1e18,r=0,ans=0;
LL an[100005],bn[100005];
scanf("%I64d%I64d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%I64d",&an[i]);
}
for(int i=0;i<n;i++)
{
scanf("%I64d",&bn[i]);
l=min(l,bn[i]/an[i]);
r=max(r,(bn[i]+k)/an[i]);
}
while(l<=r)
{
LL mid=(l+r)/2,tmp=k;
for(int i=0;i<n;i++)
{
if(an[i]*mid>bn[i])
{
tmp-=an[i]*mid-bn[i];
}
if(tmp<0)
break;
}
if(tmp<0)
r=mid-1;
else if(tmp==0)
{
ans=max(ans,mid);
break;
}
else
{
l=mid+1;
ans=max(ans,mid);
}
}
printf("%I64d",ans);
return 0;
}