競プロ備忘録

競プロerの備忘録

ABC388G - Simultaneous Kagamimochi 2

E問題で死ぬほど詰まって焦りましたが、こっちは割とスムーズに考察できました。

解法

E問題とほぼ同じ設定なので、鏡餅の個数 Kを決め打って、先頭 K個を区間内のそれ以降の餅と貪欲にマッチングさせることで構築可能かの判定が可能であり、個数の上限で二分探索すれば解ける。
ただ、こちらはクエリがたくさんあるので、判定を O(\log N)程度には落とさないとTLEする。

ここで、先頭から i個見た時点で、下敷きにする餅の候補が最低何個残っていれば K個を選び切れるか、ということを考える。これは当然、 K - i個である。
更に、何番目の餅までは使っても良いかということを考えると、 R - K + i番目までは使ってもよい。

この情報を用ると、 K個のマッチングを構築可能であるためには、 i (L \le i \le L + K)番目の餅がすべて R - (K - L) + (i - L) = R - K + i番目までしか使っていない必要がある、と言える。
この判定は、各餅について下敷きにする餅としてマッチング可能な最小インデックス next _ {i}を前計算し、 next _ {i} - iを範囲最大値クエリに載せ、 Lから L + Kの最大値が R - K以下であるかチェックすることで、 O(\log (K - L))で処理することができる。(あるいはSparse Tableなどを使えば O(1))

各クエリごと O((\log N)^{2})で処理可能であるため、全体で O(Q(\log N)^{2})で解くことができる。

実装例は以下の通り。

Submission #61602575 - HHKB Programming Contest 2025(AtCoder Beginner Contest 388)

あとがき

解けたときは爽快でしたが、AC判定出たのが終了1分前とかだったのでヒヤヒヤでした。
判定条件の言い換えをうまいこと思いついたのが助かりました。