TopCoder SRM 632

2014-09-05 | [Competitive programming]

300

長さが 1 のときは自明に可能.

長さが 2 以上のときは,少なくとも 0 と 0 以外が交互に現れる必要がある. それを満たしているときは,0 以外だけ取り出し,それぞれ 1 だけ引いたものが可能かどうかを再帰的に判定.

500

辺の capacity が 3^i と激しい差があることを用いる.

capacity が大きい辺から見ていく. 辺を使えることにしてもグラフが連結にならない場合は,単につなげておく. 連結になる場合は,その辺を通るフローをめいっぱい流す.めいっぱい流したのでグラフは結局連結にならない. めいっぱい流しても,他の辺は容量が著しく大きいので他の辺は無視してよい.

900

ある連続した線の引き方において,y 座標を変えない時,その引き方中に現れる端点たちは「同じ連結成分」に属するとよぶことにする. y 座標を変える線たちを取り払うと,重要なのは「上下のそれぞれで,連結成分を k 個作るような点の訪れ方は何通りあるか」になる. これを上下で適当に組み合わせると答えになる.

点が 1 個だけのところから連結成分たちを作ること考える. このとき,行える操作は「最後に訪れた点のすぐ左か右に新たな点を作り,そこへ行く」か「点 1 つからなる新たな連結成分を作り,そこへ移動する」のどちらかである. この構成法で訪れる順番を逆にすると,有効な訪れ方のすべてが得られる. (連結成分が変わる場合は明らかで,左右に移動する場合は,その後に新たな点が間に加えられたとしても,順番を逆にして訪れるので すでに間の点は訪れられているので,問題がない)

結局,dp[i][j] = dp[i-1][j] * 2 + dp[i-1][j] * i として,dp[N][K] により K 個の連結成分の場合の数が求められる.

結果

500 で「mod を取り忘れている」ことに気づいて resubmit (>_<)

同じミスをしている人がいたので challenge して +50

ooo +50 940.74 14 位

rating: 2975 -> 2990