Stressful Training
Stressful Training
https://ac.nowcoder.com/acm/problem/113525
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
#define int long long
double a[maxn],b[maxn];
int n,k;
struct p{
double a,b; double c;
bool operator < (const p &tmp ) const{
return c>tmp.c;
}
};
bool isok(int mid)
{
priority_queue<p>q;
for(int i=1;i<=n;i++)
if( a[i]/b[i]<k ) q.push( (p){a[i],b[i],a[i]/b[i]} );
if( q.empty() ) return 1;
for(int i=0;i<k;i++)
{
p now=q.top(); q.pop();
if( now.c<i ) return 0;
if( (now.a+mid)/now.b<k )
{
now.a+=mid,now.c=now.a/now.b;
q.push(now);
}
if( q.empty() ) return 1;
}
return 1;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) cin >> b[i];
int l=0,r=2e12,mid,ans=-1;
while( r>=l )
{
mid =l+r>>1;
if( isok(mid) ) ans=mid,r=mid-1;
else l=mid+1;
}
cout << ans;
}
