Senの競技プログラミング備忘録

こけた問題を自分用の解説で載せる。けんちょんさんのブログを目指したい。質的にも量的にも。こけた問題だけに限定するけど

ABC160 - F - Distributing Integers

atcoder.jp

概要

サイズNの木が与えられる。頂点に1~Nの番号が振られている。k=[1, N]として次の条件下で問題を解け。

  • 頂点kに最初に赤色を塗る。次に塗ることができるのは、すでに塗った頂点に隣接する頂点、というルールのもとで色を塗るとき、何通りの塗り方が存在するか?

非常に大きくなることがあるので、 10^9+7で割ったあまりを答えよ。

制約: 1 <= N <= 2 * 10^5

ACするまで

1. すべての頂点について求める木の問題、全方位木DPでは?
2. ひとまず頂点1についての問題を解いてみる。
3. 何通りになるかは、「それぞれの子供の場合の数」と「それぞれの子供のサイズ」が関与してそう。
4. 時間内で思いつかなかった。



5. 同じものを含む順列の考えを使おう!
6. バグらせずに全方位木DPをやって、AC!

考察

根が1と固定されてる時の場合の数を数え上げてみることを考える。
ひとまず、シンプルに
dp[i] := 根が1とみなした木のもとで、頂点iを根とした部分木内での埋め方の場合の数

と定めて、更新できるのか?をかんがえる。

f:id:Sen_comp:20200330203056j:plain

f:id:Sen_comp:20200330204126j:plain

全方位木DPは、
ei1333.hateblo.jp
が分かりやすいと思う。

ACソースコード
Submission #11322834 - AtCoder Beginner Contest 160

一言

惜しい。この悔しい思いをあと何回すればいいのか