AtCoder Regular Contest 148 C問題 Lights Out on Tree
問題
提出解答
問題の概要
頂点からなる根付き木 は頂点 を根とし, 頂点 の親は頂点 である.
各頂点には表裏のあるコインとボタンがある. ボタンを押すと, その頂点を根とする部分木にある全ての頂点のコインの表裏が入れ替わる.
次の 個の問に答えよ.
- 問 : 頂点 にあるコインは全て表で, これら以外の頂点にあるコインは全て裏である. 適切にボタンを推し続けることによって, 全ての頂点にあるコインを表にできるか? また, 可能ならば最小何回押さなければならないか?
制約
- は全て異なる.
解法1
まず, 次のことがわかる.
- 結果はボタンを押す順番に依らない.
- 各頂点におけるボタンを押す回数は 回または 回である.
よって, 操作の結果は各ボタンを押すか押さないかの状態によって決定される.
また, 次のことがわかる.
どんな初期状態からでも全てのコインを裏にできる.
このとき, 頂点 を見たあとは頂点 にあるコインの表裏が変わることはないから, 全ての頂点のコインが裏になる.(証明)
そして, 次のことも示せる.
状態が同じならば, 全てのボタンにおける「押す」「押さない」が一致する.
(証明)
以上のことから, 次の2つが1対1に対応する.
- ボタンの「押す」「押さない」の状態
- コインの表裏の状態
よって, 全てのコインを裏にするための「押す」「押さない」の決め方は唯一存在するので, 次を求めてもよいということが分かった.
全てのコインを裏にするために,「押す」選択をしなければならないボタンの数
解法2
このとき, 初期状態において, 押すべきボタンは以下で挙げたものであり, これらで全部である.
- 頂点 にあるコインは表ならば押す.
- 頂点 以外にあるコインで, その親にある頂点にあるコインの表裏が異なっている頂点.
これは頂点 とその親にある頂点におけるコインの表裏の一致関係を崩すためには頂点 を押すしか方法がないことによる.
よって求めるべきは以下の2つの和である.
- 一方の端点にあるコインが表で, 他方の端点にあるコインが裏である辺の数.
- 頂点 にあるコインが表なら , 裏ならば
この和はコインが表である頂点における (子の数 ) の総和を , 両方の端点にあるコインが表である辺の数を としたとき, と一致する.
については以下を満たす頂点 の数である.
- 頂点 , とその親の頂点 にあるコインが共に表である.
よって, 1問あたり 時間で求めることができ, 1テストファイルあたり木の情報を求める前計算と合わせて 時間で求めることができた.