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: