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