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