挺套路的一个题目.问最小的问题,一般就二分一下,且这个单调性真的显然.然后我们注意k只有2e5,完全可以贪心检测,1min..1min的检测嘛,贪心的策略就是ck时间,把我所坚持时间小的优先充电.貌似就么了..
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll a[N];
int n,k,b[N];
struct vv{
ll p;
int id;
ll a1;
int b1;
friend bool operator<(struct vv x,struct vv y)
{
if(x.p==y.p) return x.id<y.id;
else return x.p>y.p;
}
};
priority_queue<vv>q;
priority_queue<vv>q2;
bool ck(ll x)
{
q2=q;
for(int i=1;i<=k;i++)
{
auto temp=q2.top();
if(1ll*temp.b1*1ll*(i-1)>temp.a1) return false;
temp.a1+=x;
q2.pop();
q2.push({temp.a1/(1ll*temp.b1),i,temp.a1,temp.b1});
}
return true;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
q.push({a[i]/(1ll*b[i]),i,a[i],b[i]});
}
ll l=0,r=2e12,ans=2e12;
while(l<=r)
{
ll mid=(l+r)>>1;
if(ck(mid))
{
r=mid-1;
ans=min(ans,mid);
}
else l=mid+1;
}
ans==2e12?puts("-1"):printf("%lld\n",ans);
return 0;
}时间很紧...所以emmm

京公网安备 11010502036488号