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

CodeForces - 670D2
Magic Powder - 2
Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u

Submit Status

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

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

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 100010
using 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;
			}
			else
				r=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 100010
using 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;
			}
			else
				r=mid-1;
		}
		printf("%lld\n",ans);
	}
	return 0;
}



你可能感兴趣的:(CodeForces - 670D2 Magic Powder - 2 (二分&模拟))