D2. Magic Powder - 2
time limit per test
1 secondmemory limit per test
256 megabytesinput
standard inputoutput
standard outputThe 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
思路:直接二分查找最大能制造的饼干数,把上界设的2*10^9+1;最后你可能相差1,判断一下;
(d-1直接暴力模拟就好了)

#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll __int64 #define mod 1000000007 #define inf 999999999 //#pragma comment(linker, "/STACK:102400000,102400000") int scan() { int res = 0 , ch ; while( !( ( ch = getchar() ) >= '0' && ch <= '9' ) ) { if( ch == EOF ) return 1 << 30 ; } res = ch - '0' ; while( ( ch = getchar() ) >= '0' && ch <= '9' ) res = res * 10 + ( ch - '0' ) ; return res ; } ll a[100010]; ll b[100010]; ll check(ll x,ll gg,ll y) { ll cha=0; for(ll i=1;i<=x;i++) { if(a[i]*gg>b[i]) cha+=a[i]*gg-b[i]; if(cha>y) return 0; } return 1; } int main() { ll x,y,z,i,t; scanf("%I64d%I64d",&x,&y); for(i=1;i<=x;i++) scanf("%I64d",&a[i]); for(i=1;i<=x;i++) scanf("%I64d",&b[i]); ll st=0; ll en=2000000000; while(st<en) { ll mid=(st+en)>>1; if(check(x,mid,y)) st=mid+1; else en=mid; } if(check(x,st,y)) printf("%I64d ",st); else printf("%I64d ",st-1); return 0; }