2023年4月4日火曜日

Codeforces Round 862 (Div. 2)

 Cまで三完。Dで全方位木DPを使おうとしたら分からなくなって混乱していた。

コンテスト後のツイート

D. A Wide, Wide Graph

 全方位木DPでAC。復習になった。(結局、以前の自分の実装を元に書き直した)

 今の自分の実装(カッコ内は自分の実装での命名)では、

・単位元(unit)
・子たちの値をmergeするときの関数(compose_calc)
・子たちから計算した値からそのnodeについての値を出す関数(final_ans)
・子たちが存在しないときに入れておく値(no_composed_value)

 を決めれば答えが求まるようになっていると思う。多分、mergeの可換性も必要……というか、可換じゃない場合の求め方を理解できていない気がする。
 ただこの実装、四つ目が気持ち悪いねぇ……。なんとかしたい。


 全方位木DPが分かりにくいと思うのは、私が、「ある頂点に関する部分木に関するDP」ではなく、「辺に関するDP」だと思っているせいが大きい。

 私の実装では、UP[x], DOWN[x]で、「xとxの親を結ぶ辺」について、それぞれ、「子から親方向に見たときのDPの値」「親から子方向に見たときのDPの値」と考えている。
 ただ、これだとDOWN[x]の値が直感と一個ずれる(その親に関する部分木を考えているため)んだよね。だけど、一個ずらしてDPテーブルを定義したらもっと(自分には)もっと分かりにくくなってしまった。

 このあたりが毎回混乱の原因になっています。





0 件のコメント:

コメントを投稿