标签:
CodeForces - 670D2| Time Limit: 1000MS | Memory Limit: 262144KB | 64bit IO Format: %I64d & %I64u |
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
Sample Output
Hint
Source
#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 (二分&模拟)
标签:
原文地址:http://blog.csdn.net/yanghui07216/article/details/51365368