A Most Popular Matcha’s Snow Land (Hard)

2 secs 1024 MB
matcharate12's icon matcharate12

この問題 (Hard) は主に高度なデータ構造、連想配列、区間における添字の二分探索を問います。

Hardの解説です。
Easyでは最後の QQ 個の質問に答えるのに愚直に予約数の最大値とその個数を数えていましたが、Hardでは Q3×105Q\le 3\times 10^5 から時間制限に間に合わないので、この部分を高速化させる必要があります。
Easyでimos法を図った配列 D=(D1,D2,...Dc)D=(D_1,D_2,...D_{c}) ( cc は配列 DD の長さ) において、各要素 (すなわち Di (1ic)D_i\ (1\le i\le c) )毎に添え字をとった配列 TDi(=i1,i2,...in)T_{D_i}(=i_1,i_2,...i_n) ( ip (1pn)i_p\ (1\le p\le n)Dip=DlD_{i_p}=D_l となる添え字 ll 、また nnDip=DlD_{i_p}=D_l となる ll の個数) とし、TDiT_{D_i} を"値"、DiD_i を"キー"として持った連想配列 P(={[D1][TD1],[D2][TD2],...[Dc][TDc]})P(=\{[D_1][T_{D_1}],[D_2][T_{D_2}],...[D_c][T_{D_c}]\}) を用います。

このままでは 1iQ1\le i\le Q において、LjL_j 日目から RjR_j 日目までの区間において予約数の最大値を KK として、"キー"が KK に対応する PP の要素において LjL_j 以上 RjR_j 以下の要素の個数を愚直に探索することで求められますが、高速化を図ることはできません。しかし TT は単調増加性を持つ ( k=1,2,...ck=1,2,...c からこの順に添え字を順番に格納していくため) ことから、二分探索を用いて条件を満たす要素の個数を高速に求めることができます※。

また KK はどうやって求めるのかというと、これはセグメントツリーや Sparse Table などの、ある区間に対する最大値/最小値を高速に求める高度なデータ構造を用いて求めることが可能です。以上を用いることで時間制限に間に合わせることができるような実装が可能です。

※この個数を求める部分問題に似た類題 ABC248-D がありますので、そちらも参考にしてください。