ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC128 D - equeue

問題
提出コード

解法

Dから取り出した宝石をDに再び詰めた後、再びその宝石を取り出すのは、ただ操作回数を無駄にしているだけなので、先に取り出す宝石の個数を決めた後、捨てる宝石を全て捨てるのが最適になります。
Dの左から取り出す宝石の個数をi個、Dの右から取り出す宝石の個数をj個とします。
このとき、捨てる操作は合計でK-i-j回行うことができます。
左からi個、右からj個の宝石を取り出すとしたときに、残ったK-i-j回の操作で行う最適な「宝石を捨てる」操作は、

  • i+j個の宝石を昇順でソートし、前から最大K-i-j個、価値が負の宝石を選ぶ

となります。
この操作は、i個選ぶのが最大min(N,K)j個選ぶのが最大min(N,K)、そして捨てる個数がたかだかi+j個であり、この個数も最大でmin(N,K)個です。取り出した宝石のソートおよび捨てる操作もO(min(N,K)log \ min(N,K))でできるので、解説にもあるように、R = min(N,K)とすると、O(R^{3}logR)で最適解を調べることができます。

感想

計算量解析、考察ミスが怖くてじっくり時間をかけました。
ここら辺の証明等を高速に行いたいですね。