A. Recommendations

  • Quiz
  • AC
  • 解説
    • editorialではmultisetを使っていたが、私はpriority_queueを使った
    • サンプル1を見れば分かるように、Aの小さい方から見ていって、同じ高さに複数ある(衝突)が起こっていたら、1番大きいTだけ残して他は1段上げる必要がある
    • 現在見ている高さAにて、Tをつっこんだpriority_queueとTの和(sum)を管理しつつ、高さAを上げていけばいい

sample1 (left), and heavy sample (right)

f:id:peroon:20200824040740p:plain

int main(){
    // input
    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;
      }
      
      // discard max
      ll ma = que.top(); que.pop();
      sum -= ma;

      if(que.size()){
        // rest 1 step up
        ans += sum;
        if(se.count(v+1)==0) se.insert(v+1);
      }

      // end about the value v
      se.erase(it);
    }

    p(ans);
    
    return 0;
}