感觉这是一道不难的题目。
显然,如果有 2 个相同的数,一定是把花费较小的那个数 +1 ,如果有 3 个相同的数,一定是把花费较小的那 2 个数 +1。
那么可以得出操作的方法,假设目前在处理 (x),那么对于所有满足 (a_i=x) 的 (i) ,把除了 (b_i) 最小的全部 +1,这样可以保证花费最少。
实现的时候不需要什么高级的数据结构(还不会被卡常),每次把要操作的数放进一个堆里,每轮弹掉最大的数即可。
Code:
#define N 200005
struct Node
{
int x,y;
};
Node a[N];
int n;
bool cmp(Node x,Node y)
{
return x.x<y.x;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) a[i].x=read();
for(int i=1;i<=n;i++) a[i].y=read();
sort(a+1,a+n+1,cmp);
priority_queue<int> q;
int cur=0,cnt=0,ans=0,tmp=0;
while(!q.empty()||cur<n)
{
cnt++;
if(q.empty())
{
cnt=a[cur+1].x;
while(cnt==a[cur+1].x&&cur<n)
{
cur++;
tmp+=a[cur].y;
q.push(a[cur].y);
}
}
else
{
while(cnt==a[cur+1].x&&cur<n)
{
cur++;
tmp+=a[cur].y;
q.push(a[cur].y);
}
}
tmp-=q.top(); q.pop();
ans+=tmp;
}
cout<<ans<<endl;
return 0;
}