AtCoder 日立製作所 社会システム事業部 プログラミングコンテスト2020-D Manga Market
結構面白かったので、解説を。
解説
まず、 のときは、経過時間が指数関数的に増加していくことに気がつく必要がある。 これで、であるような店は高々 個以内に収まることがわかる。
であるような店は、明らかに最後にまとめて訪れるのが良いので、の場合のみ考える。
連続してある2つの店を訪れる順番があったとして、それを入れ替えたほうがよい条件を考える。 不等式を作って整理すると、
みたいな式が出てくる。 結局これを不等号と定義して店を並べ替えれば、いつでも前から正しい順番で店を訪れることができるので、DPが使えるようになる。 最後に であるような店を、累積和と二分探索で数えてくっつければOK。
感想
解法の大筋はコンテストの後にTwitterで知っていたが、不等式処理と証明がしっかりできたのは嬉しかった。