AtCoder AGC002 D Stamp Rally
問題
グラフ中の辺に番号
がつけられている。クエリ
が与えられるので、「辺
のみを残した部分グラフ
中で頂点集合
または
から到達可能な頂点が
個以上になる」ような
の最小値を各
について求めよ。
解法
愚直にやるなら各クエリに対してN要素のUnion-Findを作り、辺1から順に両端の頂点をuniteしていく。到達可能な頂点数(と
が非連結なら
)が
以上になる時の辺番号が答えとなる。
でTLE。
愚直手法ではuniteしてを調べる操作をクエリあたり
回もループしているので、平方分割によりこれを減らせば間に合う。あらかじめ
までuniteした
個のUnion-Findを構築しておけば、各クエリは「
<
となる
を二分探索で見つける→
のUnion-Findからスタートして、辺を1つずつuniteする(最大
回)→解
を見つけたら使ったUnion-Findを元に戻す(revert)」操作で処理できる。以下の解答コードではUnion-Findの経路圧縮をしていないので、計算量
(1.4sでAC).第1項は辺1...Mをuniteする操作、第2項は
個のUnion-Findを保存する操作、第3項はクエリの処理。
解答例
note
辺までuniteしたときの
がすぐにわかるなら二分探索できるので、永続Union-Findを使えば解ける。
永続Union-Findや平方分割のメリットはクエリを1つずつ処理できること。