ei1903の競プロメモ

競プロの解説など

HOJ 1527 - Colorful Tree

問題URL

問題概要

 N \ 頂点の木があり、頂点 \ i \ は色 \ C_i \ で塗られている。
以下のようなクエリが \ Q \ 回にわたって与えられる。順に処理せよ。

  • 頂点 \ x_i \ の色を \ c_i \ に変更し、頂点 \ x_i \ に直接繋がっている頂点の色の種類数を出力する。

制約

  •  2 \leq N \leq 5 \times 10^5
  •  1 \leq Q \leq 5 \times 10^5
  •  1 \leq C_i \leq 10^9
  •  1 \leq x_i \leq N
  •  1 \leq c_i \leq 10^9

解説

まず木を頂点 \ 1 \ を根とした根付き木として見ます。
次に各頂点について、「現在の色」、「親の頂点番号」、「親の色」、「直接つながっている頂点の{色:個数}の連想配列」を用意します。このとき、連想配列のサイズが答えるべき色の種類数です。

更新処理をする際、隣接する頂点をすべて見てしまうとTLEになってしまいます。そのため、親に対してのみ更新を行うことにします。

各頂点について、子の頂点の色が更新された場合はその時に更新されるため問題ないです。親の頂点が更新された場合は、自分の知っている親の色と実際の親の色が異なる場合連想配列の値を更新します。
このように更新処理を行うことでクエリ当たり \ O(\log N) \ で処理を行うことができます。

よってこの問題は \ O(Q \log N) \ で解くことができました。