かわらにかわらは割れない

プログラミングとかいろいろ

CF #207 A: Knight Tournament (356A)

セグ木で解けると聞いて解こうとしたけど、無理だったのでセグ木を使わず解いた。

問題概要

問題:
codeforces.com

1nまでの番号が付いたn人の王様が、勝ち残り形式で勝負をします。勝負はm回行われます。勝負は順次行われていき、i番目の勝負の情報として "戦った王様の中で一番小さい番号がl_i、大きい番号がr_i番目であり、王様x_iが勝ち抜いた" が与えられます。各王様がどの王様に倒されたかを出力してください。優勝した王様に関しては0を出力してください。

解法

セグ木を使うと聞いていたのでセグ木で解こうとしたが、更新時、クエリ時の動きが分からなくて断念した。よくよく考えると、勝負は順番に行われていくので、「l_i\le k\le r_iなる王様kが戦う勝負に関して、まだ誰に倒されたかが分かっていないときは王様kが倒された相手としてx_iを記録しておく」ことで誰に倒されたかが分かります。

実際に解くときはsetでまだ誰に倒されたか分かっていない王様を管理しておき、誰に倒されたか分かった時点でsetから除いていく(erase関数を使う)ことでうまく誰に倒されたかが分かります。i番目の勝負の勝者であるx_iに関してはまだ誰に倒されたかが分からないので、その王様に関してだけスキップすることに注意です。計算量はO(nlogn)です(間違っていたらすみません)

提出:
https://codeforces.com/contest/356/submission/60293084

計算量が間違っていたり、セグ木での解き方が分かる方は教えてください。