Official

B - Abs Abs Function Editorial by chinerist


グラフを観察すると \(\left| \left|x-a\right| -b \right| = \min(\left|x-(a-b)\right|,\ \left|x-(a+b)\right|)\) が成り立つことがわかります。よって整数集合 \(S'\)\(S'=\{a-b,\ a+b \mid (a,\ b) \in S\}\) と定めると、 \(f_S(x)=\min_{y \in S'} \left|x-y\right|\) となります。

するとクエリ \(2\) について、 \(S'\)\(a_i\) 以上 \(b_i\) 以下の要素が存在する場合、答えは \(0\) です。そのような要素が存在しない場合、 \(a_i\) 未満の要素の最大値を \(L\)\(b_i\) より大きい要素の最小値を \(R\) とすると \(\min(a_i-L,\ R-b_i)\) が答えになります。

\(S'\)\(a_i\) 以上 \(b_i\) 以下の要素が存在するかの判定、\(L,\ R\) の求値は \(S'\)std::set やそれに相当するデータ構造で管理することで \(O(\log Q)\) で行うことができます。

以上よりこの問題は \(O(Q\log Q)\) で解くことができます。

posted:
last update: