AtCoder Beginner Contest 249 F問題 Ignore Operations
問題
提出解答
問題の概要
で初期化された変数
がある.
の順に以下の操作を行う.
ならば,
ならば,
ただし, この 個の操作のうち, 高々
個の操作を無視することができる.
このとき, 最終的な の最大値を求めよ.
制約
解法
のときの操作は代入であるが, 代入操作をする場合,
番目までの操作は最終的な結果には一切影響を与えない. そこで, 最後にいつ代入を行ったか (または, 一切代入をしない) で場合分けし, 最大値を求めることにする.
となる
を
,
となる
を
とする.
代入を一切しない場合を考える. これは の場合はできない. よって,
とする. このとき,
の中から高々
個を取り除いて和を最大にする問題になる. これは
にある負の個数が
個以下ならば, 非負の総和が解の候補になる.
にある負の個数が
個より多ければ, 小さい方から
個を除いた総和が解の候補になる.
最後に行う代入が 番目の操作であるとする. そして,
であるとする. このとき,
*
にある負の個数が
個以下ならば, 非負の総和が解の候補.
*
にある負の個数が
個より多ければ, 小さい方から
個を除いた総和が解の候補.
ここで, 代入をしない場合について, 番目の操作として,
であると考えると, この場合と同一視できる.
小さい方から 個を除いた総和を求める方法についてはヒープを利用することにより高速に求めることができる.
以上から, 時間計算量 で求めることができる.