CodeForces - 670D2 Magic Powder - 2 (二分&模拟)

来源:互联网 发布:淘宝网1元秒杀在哪里找 编辑:程序博客网 时间:2024/05/16 11:59
CodeForces - 670D2
Magic Powder - 2
Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u

SubmitStatus

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 andk (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 thei-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 thei-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

Input
1 100000000011000000000
Output
2000000000
Input
10 11000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 10000000001 1 1 1 1 1 1 1 1 1
Output
0
Input
3 12 1 411 3 16
Output
4
Input
4 34 3 5 611 12 14 20
Output
3

Sample Output

Hint

Source

Codeforces Round #350 (Div. 2)

//题意:同上一题,就是数开大了,得用二分
Hait: INF比较小,所以得用3000000000ll就行了
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#define ll long long#define INF 0x3f3f3f3f#define N 100010using namespace std;ll a[N],b[N];int n;ll k;bool judge(ll x){ll s=k;for(int i=1;i<=n;i++){if(x*a[i]>=b[i])s-=(x*a[i]-b[i]);if(s<0)return false;}return true;}int main(){int i;while(scanf("%d%lld",&n,&k)!=EOF){for(i=1;i<=n;i++)scanf("%lld",&a[i]);for(i=1;i<=n;i++)scanf("%lld",&b[i]);if(n==1){printf("%lld\n",(k+b[1])/a[1]);continue;}ll l=0,r=3000000000ll,mid,ans;while(l<=r){mid=(l+r)>>1ll;if(judge(mid)){l=mid+1;ans=mid;}elser=mid-1;}printf("%lld\n",ans);}return 0;}

这是刚开始写的,比较麻烦。
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#define ll long long#define INF 0x3f3f3f3f#define N 100010using namespace std;ll a[N],b[N];struct zz{ll a;ll b;ll c;ll d;}p[N];bool cmp(zz a,zz b){return a.a<b.a;}int n;ll k;bool judge(ll x){ll s=0;for(int i=1;i<=n;i++){if(p[i].a<x)s+=p[i].c+(x-p[i].a-1)*p[i].d;if(s>k)return false;}return true;}int main(){int i;while(scanf("%d%lld",&n,&k)!=EOF){for(i=1;i<=n;i++){scanf("%lld",&a[i]);p[i].d=a[i];}for(i=1;i<=n;i++)scanf("%lld",&b[i]);if(n==1){printf("%lld\n",(k+b[1])/a[1]);continue;}for(i=1;i<=n;i++){p[i].a=b[i]/a[i];p[i].b=b[i]%a[i];p[i].c=a[i]-p[i].b;}sort(p+1,p+n+1,cmp);ll l=0,r=3000000000ll,mid,ans;while(l<=r){mid=(l+r)>>1ll;if(judge(mid)){l=mid+1;ans=mid;}elser=mid-1;}printf("%lld\n",ans);}return 0;}



0 0
原创粉丝点击