Description
The term of this problem is the same as the previous one, the only exception — increased restrictions.
Input
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.
Output
Print the maximum number of cookies, which Apollinaria will be able to bake using the ingredients that she has and the magic powder.
Sample Input
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
题意:制作一个饼干需要n种原料,对于原料i需要a[i],现在已有b[i]的i原料,同时Apollinar还有k的万用原料,万用原料能变成任意一种原料。现在让你求出最多能制作多少饼干
思路:直接对饼干数进行二分
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; __int64 n,k,i,l,j,m,a[100010],b[100010]; int main() { while(scanf("%I64d%I64d",&n,&k)!=EOF) { for(i=0;i<n;i++) scanf("%I64d",&a[i]); for(i=0;i<n;i++) scanf("%I64d",&b[i]); __int64 left=0; __int64 right=2000000000; __int64 ans=0; while(left<=right) { __int64 mid=(left+right)/2; int flag=1; m=k; for(i=0;i<n;i++) { if(a[i]*mid>b[i]) { if(m-(a[i]*mid-b[i])>=0) m=m-(a[i]*mid-b[i]); else { flag=0; break; } } } if(flag==1) { ans=mid; left=mid+1; } else right=mid-1; } printf("%I64d\n",ans); } return 0; }