ABC320

5完。前半早解きできるいいセットだったよ。疲れた。誤読したFのupsolveしたくない。

A - Leyland Number

10^9より小さい2数の和なのでintでOK。このくらいの数ならdoubleで誤差なく扱えるので普通にpowを使う。久々の1分切り。俺たちのA問題が帰ってきた。

B - Longest Palindrome

区間を長い順に全列挙して最初に見つけた回文の長さを出力して終了。かなりのコード量を書いた気がしたが、内容が簡単なので4分程度で済んでいる。

C - Slot Strategy 2 (Easy)

Gが解けるならCをやる必要はない。一旦飛ばして様子を見たいところだったが、さすがにratedでは前からやるのが無難ということで、Gを見ずにCをやってしまった。いやあ、コンテスト中は(結果的にCを先にやってよかったとなる可能性が高いのは前提で)Cを飛ばさなかったことを後悔していたが、さすがに、実際にそうするのはかなり度胸が要るよなあ。

何で揃えるかを全探索。順番が決まっていれば貪欲なので順番6通りも全探索。実装は重くて10分かかった。嫌な実装ではない。

D - Relative Position

明らかに解けるけど、具体的にどうするかすぐに見えなくて一旦トイレ(小)。出しているうちに方針がまとまった。UnionFindを使って全域木を作る(矛盾する情報は与えられないので全域木に使わない辺は捨てていい)。その木で頂点1からDFS、子の座標を求めながら。undecidableかの判定はUnionFindでできる。まあ、UnionFindなしでも普通にDFSすればよかったんだけど、これはこれできれいに書けたんでよかった。

E - Somen Nagashi

列の状態をsetで管理するのはすぐ思いつく。列に戻るのをpriority_queueでやればいいというのはけっこう思考の整理が必要だった。あとは適切に出し入れすればいい。

ABに5分、CDEにそれぞれ10分ずつという感じだった。ここまでみんな簡単で、まだ「何もしていない」のだが、結果的にはそのままコンテストを終えることになった。

F - Fuel Round Trip

残りの時間はFメインでやっていた。

幅301の道を進むイメージ。もうちょっと考えて、後ろから進むのと戻るのを同時にやればDPできそう。制約の見た目からNが10^5と誤読しており、どうしてもH^2が付いてしまうと思っていた。結局何もできず。

(追記)計算量が大丈夫なら解けた。いや、しっかり詰めるのが大変だ。レーティングのことよりも、このややこしいDPをコンテスト中の集中力でできなかったことが痛いと思うくらい、もうやりたくない。コンテスト終了後は疲れていてできなかったし、翌日の今日もなんか昨日と違って頭の調子が微妙。座標X_Nにも0円0リットルのガソリンスタンドがあることにする。左からDPしていく。ガソリンスタンドのすぐ右(?)での行きと帰りの燃料の量を状態として持つ。DPのタネは、基本INFで行きの燃料がHのところだけ0(帰りはなんでもいい)。DPが終わったら、最後の場所で行きと帰りの燃料が同じ量になっているところの最小値が答え。3WAでめちゃくちゃきつかった。Fは不可能のF。今回もか。F_iリットル未満の燃料を得ることもあることを忘れていたのと、付け足したその処理で行きの燃料が次のガソリンスタンドまで持つかのチェックを入れ忘れたのと、行きのときにもF_iリットル未満の燃料を得ることがあるのを忘れていたので3WA。

G - Slot Strategy 2 (Hard)

フローっぽい気がした。要らない辺の削減とかはあとでやるとしてとりあえずフローでできないか考えたが、よくわからなかった。そうじゃなくて正面からやるとしたら、位置毎の個数とかかな。リール毎にどれを取るか決めておけば、個数が一番多いやつの一番右の位置ってことになるのかな。取る候補をO(N)にできるのかどうかもよくわからない。

(追記)いやー二分探索もちょっと思ったけど、一発でやるほうをメインで考えてたな。遅いと思ったのか?解説にあることは、言われてみればそりゃそうだって感じで、でもその各ステップが全くできなかった。計算量がO(N^3)というのがまず全くイメージできない。