目次

AtCoder Regular Contest 142 D問題メモ

AtCoder Regular Contest 142

コーナーケース発見力がよわよわだった。速解き回でこれは致命的。

D - Deterministic Placing

D - Deterministic Placing

問題

解法

初期状態から「よい操作」を1回行った後、各コマをさっきと逆方向に動かせば、それも「よい操作」で、初期状態に必ず戻る。
これが一意に決まるのだから、操作は、初期状態と(一意に決まる)1回操作後の状態を交互に繰り返すしかないことがわかる。

木DPで解けそうな見た目をしているので、その方向で考える。
頂点1を根とした根付き木として、各頂点に対して、

などで場合分けして、その時々の、部分木内のコマの置き方のパターン数をDPすればよさそうだが、とにかく遷移がややこしい。

結構な試行錯誤を経て、以下の場合分けでよいとなる。

(t0, t1) でどの状態か?

○:白  ●:黒  ◎:どちらでもよい・不定

  ①a          ①b          ③                 ④
     t0  t1       t0  t1       t0      t1        t0  t1
親   ◎  ●       ◎  ●
     ↑  ↓       ↑  ↓
     ●  ●       ●  ○       ●      ●        ●  ○
     ↑  ↓                   ↙↖    ↗↘       ↓  ↑
子   ●  ◎                  ◎  ●  ●  ◎      ◎  ●

②a,②bは①a,①bのt0とt1を交換したもの、⑤は④のt0とt1を交換したものとなる。

奇数偶数両方の操作後ともコマがない場合というのは、よい操作が一意に決まらないので除外して考えてよい。

それぞれの遷移を考える。特に、複数の子をマージする場合に、一意に決まらなくなってしまう場合を注意する。

で、上記を考えるとき、①aと①b、②aと②b の結果はくっついていても計算に問題は無いので、計算上はまとめてよい。

子をマージするときは、DPの要領で、基本は各子の③,④,⑤のパターン数を掛け合わせつつ、 「既に①を1回選んだ/まだ選んでない」などで場合分けして、1回のみ①を含むパターン数などを求めればよい。

Python3