AtCoder Beginner Contest 279 F問題 BOX
問題
提出解答
問題の概要
個の箱 と 個のボール がある. 最初, 箱 にはボール のみが入っている.
次の 個のクエリを順に処理せよ.
- Type 1 : 箱 に入っているボールを全て箱 に移す.
- Type 2 : この時点で 個の箱に入っているボールの数を としたとき, ボール を箱 に入れる.
- Type 3 : ボール が入っている箱の番号を答える.
制約
- Type 1 :
- Type 2 :
- Type 3 : そのクエリが与えられた時点でボール がいずれかの箱に入っている.
- Type 3 のクエリが1個以上存在する.
解法
まず, 最初に 個のボールがあって, 途中で加えられるボールの数は高々 個 *1 であるから, 高々 番までのボールについてを考えれば良い.
そして, このクエリにおいて, 相異なる2つのボールが同じ入っている瞬間があった場合, それ以降は常にその2つの箱は同じ箱に入っていることに気づく.
よって, Union Find による Union が有効になる. Union Find は無向グラフにおける連結成分に対する操作ともみなせるから, 次のように問題を帰着できる.
頂点 辺の無向グラフ がある. なお, 頂点は と名付けられている. また, 最初, 頂点 は色 で塗られていて, 頂点 は色 で塗られている. 次の 個のクエリを順に処理せよ.
- Type 1 : 色が であるような頂点と色が であるような頂点同士を全て無向辺で結び, 色が であるような頂点を全て頂点 で塗替える.
- Type 2 : 色が であるような頂点のうち, 番号が最小であるものを とする. 頂点 を色 で塗る.
- Type 3 : 頂点 の色を答えよ.
クエリの高速化を目指す.
- 同じ連結成分にある頂点は全て同じ色なので, 各頂点に色を持たせるのではなく, 各連結成分に色をもたせれば良い.
- Type 2 において, 既に色が であるような頂点が存在するならば, そのような頂点たちと頂点 を結ぶ辺を追加することにする. このことにより, 各色に対して, その色で塗られている連結成分の数が常に1個以下になる.
- Type 1 において, 上で述べたことから, 色が であるような頂点と色が であるような頂点同士を全て無向辺で結ぶのではなく, (両者をみたすような頂点が存在する場合) 色が であるような頂点1個と色が であるような頂点1個を選び出し, それらを結ぶだけで十分である.
- Type 2 はタイプ に於ける と考えることが出来る.
以上から, 次のようにして高速に処理できる.
- 頂点の Union Find を用意する.
- であるような列 を用意する. この列は色が であるような頂点を1つ見つける際に用いられる (存在しない場合は とする)
- クエリの順に次を実行する.
- Type 1 : 色が であるような頂点が存在しない (つまり, ) 場合は何もしない. 以降は存在する場合とする.
- 色が であるような頂点が存在しない場合, が属する連結成分の色を にする. その後, とする.
- 色が であるような頂点が存在する場合, において, を に merge させる. その後, とする.
- Type 2 : (Type 1 に帰着させる)
- Type 3 : 頂点 が属しているような連結成分の色を答える.
- Type 1 : 色が であるような頂点が存在しない (つまり, ) 場合は何もしない. 以降は存在する場合とする.
(※ 提出解答における Coloring Union Find では merge 関数を設定することによって, merge による色の変更を自動的に行ってくれる).
*1:Type 3 のクエリが1個以上存在するというクエリのため, 個にはならない