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,不要超了范围。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long a[100001];
long long b[100001];
int main()
{
long long n,k;
scanf("%I64d %I64d",&n,&k);
for(int i=1; i<=n; i++)
{
scanf("%I64d",&a[i]);
}
for(int i=1; i<=n; i++)
{
scanf("%I64d", &b[i]);
}
long long x = 0;
long long y = 2000000000;
long long minx = 0;
while(x <= y)
{
long long mid = (x+y)/2;
long long kk = k;
long long i;
for(i=1; i<=n; i++)
{
if(mid*a[i] > b[i])
kk -= (mid*a[i]-b[i]);
if(kk<0)break;
}
if(i==n+1) {x=mid+1;minx = max(minx,mid);}
else y=mid-1;
}
printf("%I64d\n",minx);
return 0;
}
水波。