Official

F - Invisible Hand Editorial by kyopro_friends


この問題は二分探索を用いて解くことができます。

\(f(x)\) を、りんごを \(x\) 円で売ってもよいと考える売り手の人数、すなわち \(A_i\leq x\) を満たす \(i\) の個数とします。
\(g(x)\) を、りんごを \(x\) 円で買ってもよいと考える買い手の人数、すなわち \(B_i\geq x\) を満たす \(i\) の個数とします。

求めるものは \(f(x)\geq g(x)\) を満たす最小の \(x\) です。

ここで、\(f(x)\)\(x\) の増加に伴い(広義)単調増加し、\(g(x)\)\(x\) の増加に伴い(広義)単調減少します。
(値段を釣り上げると売り手は増え買い手は減ります)

したがって、ある \(x\)\(f(x)\geq g(x)\) となるなら、\(x\leq y\) となる任意の \(y\)\(f(y)\geq f(x)\geq g(x)\geq g(y)\) を満たします。すなわち、\(f(x)\geq g(x)\) であるかどうかには単調性があるため、これを満たす最小の値は二分探索により求めることができます。

与えられた \(x\) に対して \(f(x),g(x)\) の値を求めるには \(O(N+M)\) 時間かかるので、問題は \(O((N+M)\log \max A_i)\) で解けます。

別解

答えとなりうるのは、\(A_i\) の値か \(B_i+1\) の値に限ることがわかります(証明略)。したがって、これらの値を小さい順に調べ、\(f(x),g(x)\) の計算の際には前の値との差分のみを調べることで、全体で \(O((N+M)\log (N+M))\) で問題を解くことができます。\(\log\) はソートによるものです。

posted:
last update: