ferinの競プロ帳

競プロについてのメモ

Donutsプロコンチャレンジ2015 D - ドーナツの箱詰め

問題ページ

まず Q=0 のときの解き方を考える。c_i についてソートしておく。この数列の差分について小さい方から n-k 個の和が答えになる。差分が大きいところから k-1 個と一番小さい箱にドーナツを入れることでこれは達成できる。

数列の小さい方から x 個の和を求めるのにはセグ木、平衡二分探索木などのデータ構造を用いればよい。今回はRBSTを使う。

d 番目の箱が潰されるときのデータ構造の変化について考える。d 番目の箱より小さい最大の箱を \text{prev}(d)d 番目の箱より大きい最小の箱を \text{next}(d) と表すことにする。a \lbrack d \rbrack -\text{prev}(d)\text{next}(d)-a \lbrack d \rbrack をRBSTから消去し、\text{next}(d)-\text{prev}(d) をRBSTに追加すればよい。prev, next については std::set で実現可能なのでこの問題は解けた。