挺套路的一个题目.问最小的问题,一般就二分一下,且这个单调性真的显然.然后我们注意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