AGC033 C問題:Removing Coins

問題. Removing Coins

 N 頂点の木が与えられる.初めにすべての頂点に1つのコインが置いてある.2人のプレイヤーが交互に次の操作を行う.操作の行えないプレイヤーを負けとする.
コインが置いてある頂点  v を1つ選び, v にあるコインを取り除く.そして  v 以外のコインが置いてある任意の頂点  u に対して, u にあるコインを  v に近い隣接頂点へ移動する.
2人のプレイヤーが最適な行動を行ったときにどちらが勝つかを判定せよ.

制約 1 \le N \le 2 \times 10^5

解法.木の直径

本番で解けなかったので 解説 を参考にした.


コインが置いてある任意の頂点  v に対して操作を行ったとき,操作後のコインの配置は  v を根とした根付き木から葉を取り除いた部分木となる.このとき,葉が取り除かれることから直径は少なくとも 1 小さくなり,直径がちょうど 1 小さくなるための必要十分条件 v が直径の端点となることである.また, v が直径の端点以外なら直径はちょうど 2 小さくなり,直径が 3 以上小さくなることはない.以上から頂点数が 3 以上のときは直径を 1 または 2 小さくする頂点が存在するので,直径を勝利判定に使えないかを考える.
直径が 0 の木は孤立点のみで先手勝ちとなる.次に,直径が 1 の木は頂点数が 2 の道のみであり,どの頂点を選んでも孤立点となるので後手勝ちとなる.次に直径が 3 のときは,直径を 1 または 2 減らす操作が存在するので先手勝ちとなる.直径が 4 以上の場合も同様に考えると,後手勝ち,先手勝ち,先手勝ち,・・・となり,直径の 3 による剰余が 1 のときのみ後手勝ちとなり,それ以外の場合は先手勝ちとなることが分かる.したがって,直径を線形時間で求めた後に剰余を取って判定することで勝敗が分かる.

計算時間 O(N)

道の場合で同様の推論ができたのに木の場合で解くことができずに残念.