不 要 把 这 题 想 复 杂 了 , 不 然 很 麻 烦 不要把这题想复杂了,不然很麻烦 不要把这题想复杂了,不然很麻烦

因 为 只 需 要 处 理 相 同 的 数 字 , 所 以 每 次 把 相 同 的 数 装 进 优 先 队 列 因为只需要处理相同的数字,所以每次把相同的数装进优先队列 因为只需要处理相同的数字,所以每次把相同的数装进优先队列

当 然 如 果 只 有 一 个 数 就 不 需 要 进 去 了 当然如果只有一个数就不需要进去了 当然如果只有一个数就不需要进去了

每 次 a n s 加 上 装 进 去 数 的 花 费 , 因 为 这 些 数 至 少 都 要 加 1 每次ans加上装进去数的花费,因为这些数至少都要加1 每次ans加上装进去数的花费,因为这些数至少都要加1

代 码 里 有 注 释 代码里有注释 代码里有注释

因 为 每 个 数 只 会 进 出 队 列 1 次 , 所 以 复 杂 度 是 O ( n l o g ( n ) ) 因为每个数只会进出队列1次,所以复杂度是O(nlog(n)) 因为每个数只会进出队列1次,所以复杂度是O(nlog(n))

#include <bits/stdc++.h>
using namespace std;
const int maxn=4e5+9;
#define int long long
struct p{
int x,y;
}a[maxn];
bool com(p a,p b){
return a.x<b.x;
}
int n;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].x;
for(int i=1;i<=n;i++) cin>>a[i].y;
sort(a+1,a+1+n,com);
priority_queue<int>q;
int st=1,sumn=0,ans=0,now=0;
while(st<=n||!q.empty())
{
if(q.empty()) now=a[st].x;//空了就放下一个数
while(st<=n&&a[st].x==now)
{
q.push(a[st].y);
sumn+=a[st].y;
st++;
}
sumn-=q.top();
q.pop();//弹出最大消耗的数
ans+=sumn;//本次消耗
now++;//下次的最大数
}
cout<<ans;
}