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つずつ処理できること。