この記事は 帰ってきた AOJ-ICPC Advent Calendar 2022 5 日目 の記事です。
問題概要
https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2563
個の配列 があります。初め、全ての配列は空です。
この配列に対して次の 個の操作を行いました。
・配列 に対し、整数 を末尾に追加する。
以下の 個のクエリを処理してください。
・配列 に含まれる全ての要素を値が小さい順にソートした時、 番目の要素を出力しなさい。
解法
クエリに対して、並列二分探索をします。
各クエリに対して、値 以下の数が配列 から の中に幾つ含まれるか知りたいです。
初めの 個の操作について追加する値、 個のクエリについて で二つを合わせてソートすると、以下の問題に帰着されます。
数列 に対して、以下の 種類のいずれかを行うクエリを処理する。
・ から に を加算
・ から の値の総和を求める
これは遅延セグ木を用いると答えることができますが、今回は が大きいため、普通にやると TLE/MLE します。
必要なところだけ作る遅延セグ木を用いると AC できます。
(実際には必要なところだけ作る遅延セグ木でも TLE したので、必要なところだけ作るStarrySkyTreeを用いました)
実装例
終わりに
多分殴ってます。別解が存在したら追記するかもしれません。
追記 : これ座圧遅延セグ木で良いですね、解散
必要なところだけ作る (遅延セグ木 / StarrySkyTree) についての記事も出すかもしれません。