問題はこちら
問題概要
数直線上の

の位置にあるゴミを2つ以下の座標に集める. 1回の操作につき, 座標

にあるゴミをまとめて

か

に移動させることができる. 最小の操作回数を求めよ. また, ある座標へのゴミの追加や削除クエリが

個与えられるのでそれぞれのクエリ後の最小操作回数も求めよ.

思考の流れ
集める2か所の決め方を考える. 集めるゴミは
区間になっていることは簡単にわかる. 左側の1か所に集めるゴミのindexを

, 右側の1か所に集めるゴミのindexを

とすると, 最小操作回数は

となる.

となるので, これを最小とするには

を最大とする

を求めればいいことがわかる.

追加・削除のクエリ後に
の最大値を求められればいい. 追加・削除・最大値取得ができるデータ構造といえば, 平衡二分木などがある. ちょうどC++のsetの機能で実現できるので解ける.
追加クエリでは追加する座標を
とすると,
と隣り合ったゴミの座標
をもとめてsetに
,
を追加し, 今まであった
を消せばよい. 削除クエリも同様に行う.
提出プログラム
https://codeforces.com/contest/1418/submission/93091660感想
問題読み間違えて中央値求めるアレかと思った.