D2. Magic Powder - 2
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Examples
Input
1 1000000000
1
1000000000
Output
2000000000
Input
10 1
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000
1 1 1 1 1 1 1 1 1 1
Output
0
Input
3 1
2 1 4
11 3 16
Output
4
Input
4 3
4 3 5 6
11 12 14 20
Output
3

题意:http://www.cnblogs.com/hsd-/p/5464525.html

         (补)直通D1  数据范围变大

题解:二分处理

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define ll __int64
 5 using namespace std;
 6 ll n,k;
 7 ll a[100005];
 8 ll b[100005];
 9 ll gg;
10 bool check(ll x)
11 {
12     ll gg=k;
13     for(int i=1;i<=n;i++)
14     {
15         if((x*a[i])>b[i])
16         {
17             ll cha=x*a[i]-b[i];
18             gg=gg-cha;
19         }
20         if(gg<0)
21             return false;
22     }
23     return true;
24 }
25 int main ()
26 {
27     scanf("%I64d %I64d",&n,&k);
28     ll gg=0;
29     for(int i=1;i<=n;i++)
30         scanf("%I64d",&a[i]);
31     for(int i=1;i<=n;i++)
32         scanf("%I64d",&b[i]);
33      ll l=0,r=2000000000,mid;
34      while(l<r)
35      {
36          //cout<<l<<" "<<r<<endl;
37          mid=(l+r+1)>>1;
38          if(check(mid))
39             l=mid;
40          else
41             r=mid-1;
42      }
43      cout<<l<<endl;
44     return 0;
45 }