競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 320E問題

ABC320E

解法

シュミレーション. 時刻毎のイベントを priority queue に入れておく. 食べるイベントと,人が復帰するイベントに分ける.

注意

人が復帰するのと,食べるイベントが同時刻の場合, 人が復帰するのを先に行うので,priority queue の順序に注意.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n,m;
  cin >> n >> m;

  min_priority_queue<tuple<ll,ll,ll>> ev;
  rep(i,m){
    ll t,w,s; cin >> t >> w >> s;
    ev.push({t,w,s});
  }
 
  set<ll> hu; rep(i,n) hu.insert(i);

  vll ans(n+1);
  while(ev.size()){
    auto [t,w,s] = ev.top(); ev.pop();

    if(w > 0){
      ll ind = n;
      if(hu.size()) ind = *(hu.begin());
      ans[ind] += w;
      hu.erase(ind);
      ev.push({t+s, -1, ind}); // -1 < (そうめんの量) なので,同じ時刻は復帰優先
    }else{
      hu.insert(s);
    }
  }

  rep(i,n){
    cout << ans[i] << endl;
  }
 
  return 0;
}