- Quiz
- AC
- 解説
- editorialではmultisetを使っていたが、私はpriority_queueを使った
- サンプル1を見れば分かるように、Aの小さい方から見ていって、同じ高さに複数ある(衝突)が起こっていたら、1番大きいTだけ残して他は1段上げる必要がある
- 現在見ている高さAにて、Tをつっこんだpriority_queueとTの和(sum)を管理しつつ、高さAを上げていけばいい
sample1 (left), and heavy sample (right)
int main(){
ll N;
cin>>N;
VI A(N);
rep(i, N) cin >> A[i];
VI T(N);
rep(i, N) cin >> T[i];
map<ll,VI> mp;
rep(i,N){
ll a = A[i];
ll t = T[i];
mp[a].push_back(t);
}
ll ans=0;
set<ll> se;
for(ll a : A) se.insert(a);
priority_queue<ll> que;
ll sum = 0;
while(se.size()){
auto it = se.begin();
ll v = *it;
for(ll a : mp[v]){
que.push(a);
sum += a;
}
ll ma = que.top(); que.pop();
sum -= ma;
if(que.size()){
ans += sum;
if(se.count(v+1)==0) se.insert(v+1);
}
se.erase(it);
}
p(ans);
return 0;
}