これを通せたおかげで予選通過できました。嬉しい。
解法
とします。DPをします。
ガソリンスタンド
まで来るにあたって、ガソリンスタンド
で最後に補給するとしたときの、そこまでのガソリンスタンドを書店に建て替えるパターン数
次の3つを考える必要があります。
- 近くのガソリンスタンド
で補給をしていてガソリンスタンド
で補給ができないとき、ガソリンスタンド
を書店に建て替えても建て替えなくても変わらない
- やや遠くのガソリンスタンド
で補給をしていてガソリンスタンド
で補給ができるとき、ガソリンスタンド
を書店に建て替えるなら最後に補給した場所は変わらず、建て替えないなら最後に補給したガソリンスタンドは
になる
- めっちゃ遠いガソリンスタンド
で補給をしていてガソリンスタンド
までたどり着けないとき、ガソリンスタンド
までの情報は無意味になる
まとめると、次のようになります。
これを愚直に処理するととなりTLEします。データを使いまわしてオーダーを落とすことを考えましょう。
列の末尾項を
倍し、その前の
項の区間和を末尾に追加するという操作ができればいいわけです。
さらに、項は「倍区間」→「区間和区間」→「無意味な区間」と移動する事を利用し、それぞれの区間をqueueで持ち、区間和も持っておけば、遷移が高速化できます。要は尺取法なので、全体の計算量は
となります。
反省
ARC070 Eでやったのと似たようなDPの高速化でした。勉強の成果が出せてよかったです。
この回のC問題と同じく、方針はすんなり立てられたように思います。DPは得意分野にしていきたいです。
そして何より
こどふぇす予選通過してた……!
— ウォンバット (@wombat_packer) 2018年9月26日
本選er各位よろしくです🙇♂️
精進します!