全順序集合に対するimos法の拡張
AtCoder Beginner Contest 128のE - Roadworkで、imos法を拡張したアルゴリズムを思いついたのでメモ。
前提
定式化
「E - Roadwork」は座標圧縮などを使うと次の問題に帰着できる。
- 以下が与えられる:
- 最大元 をもつ全順序集合
- 自然数 と集合
- で埋められた長さの配列を用意する。
- 個の次のクエリ を処理する:
- に対して の更新をする。
- 個の次のクエリ を処理する:
- 現在の の値を出力する。
愚直な解法
- クエリを順に愚直に処理すると、全体の計算量はとなる。
- 配列を使わずに個のクエリを処理する場合はとなる。
制約が「」だと間に合わないのでに落としたい。
imos法っぽい解法
- vector<X>(上の動的配列)*1を要素にもつ大きさの配列を2つ用意する。これを配列 とする。
- 個のクエリに対して次のように処理する:
- 上の重複要素を許す平衡二分探索木を用意する。具体的には次のメソッドがある:
- :でを挿入する。すでにが入っている場合も重複して挿入する。
- :でを1つ削除する。
- :もっている要素のうち最小の値をで返す。空のときはを返す。
-
-
- 個の次のクエリに対して次のように処理する:
- を出力する。
このようにimos法っぽいアルゴリズムでクエリを処理すると、時間計算量は
- (2)で
- (4)で
- (5)で
となり、全体の時間計算量はとなる*2。
まとめ的なにか
ぶっちゃけ遅延セグ木があれば事足りるので、不要なアルゴリズムな気もする。
ただし実装は楽だし、たぶん定数倍も遅延セグ木より早いので、使える場面はあるかもしれない。