AtCoder Beginner Contest 204のきろく
AtCoder Beginner Contest 204で久しぶりにレート上昇しました!
- A - Rock-paper-scissors (100点)
- B - Nuts (200点)
- C - Tour (300点)
- D - Cooking (400点)
- E - Rush Hour 2 (500点)
- F - Hanjo 2 (600点): 未提出
- 結果、感想
A - Rock-paper-scissors (100点)
人のじゃんけんであいこになるのは、全員同じ手を出すか、全員違う手を出した時なので、 のときはその手、そうでないときは の手を出せばいいです。また、サーバルの出した手に対応する文字を としたとき、 となることを利用すると となります。
B - Nuts (200点)
for
とif
を組み合わせて答えを出すことができますが、各 について足す数は であるのでこれを足していく方が多分少し短いです。
C - Tour (300点)
全頂点対について移動が可能かどうかなので、Warshall-Floyd法で...とすると なので間に合いません。
始点を固定した時同じ頂点を2度以上訪れないようにしたDFSやBFSを行うと、どの頂点も辺も高々1回しか通らないので でその始点から訪れることができるかどうか判別できるので、その始点を全て試して足して合わせてやることで で判定することができます。
D - Cooking (400点)
コストをlong long
にし忘れと辺を双方向につなぎ忘れによって3WA出してしまいました... これがなければ、青色復帰できたのに...
を二つの集合 に空集合を許した分割を行ったときの が答えです。分割の方法は 通り存在するため、全探索では間に合いません。
この問題は部分和問題であるためDPの利用を考えます。
E - Rush Hour 2 (500点)
任意の整数時間待機することができるので、各都市への最速到達時間を考えればいいです。道路 を通って都市 から時刻 に出発して都市 に到達する時刻は となります。 とした時 であり、 は で単調減少、 で単調増加することから、 のときに最小値をとり、 であることから も 附近で最小値をとることが分かります。ちゃんとした解説は公式解説を参照して下さい。
上記から各道を通った時の反対側に着く時刻が最小値となるような出発時刻 が求まります。よって、頂点 に到達可能な最速時刻が であるとき、 の時は まで待ってから、 の時は即座に道 を用いることでその道を用いて へ行く経路のうち最速で に行くことができるため、このように改造したDijkstra法で答えを求めることができます。
F - Hanjo 2 (600点): 未提出
制約からbitDP+行列累乗かなと思いましたが、漸化式が書けませんでした...
結果、感想
久しぶりにレートが上昇しました。速く青色復帰したいです。