ABC130 F問題:Minimum Bounding Box

問題. Minimum Bounding Box

平面上に  n 個の点がある.時刻 0 のときの  i 番目の点の座標を  (x_i, y_i) とする.各点は時刻 0 から秒速 1 で決まった方向に同時に動き出す.ただし,動く方向は軸並行に左右上下のいずれか一方向のみである(または動かない).ある時刻での各点の  x 座標と  y 座標の最小値と最大値をそれぞれ  x_{\min}, x_{\max}, y_{\min}, y_{\max} としたとき,そのときの値を  (x_{\max} - x_{\min}) \times (y_{\max} - y_{\min}) とする.この値としてとりうる最小値を求めよ.

制約 1 \le N \le 10^5,  -10^8 \le x_i, y_i \le 10^8

解法.三分探索

三分探索 で解く.

関数  f_{x, i} (t) を時刻  t での  i 番目の点の  x 座標とする. f_{x, i} は傾きが -1, 0, 1 のいずれかで,切片が  x_i の直線となる.したがって,これらの最大値  x_{\max} (t) = \max_{1 \le i \le n} f_{x, i} (t) は凸関数となり,これらの最小値  x_{\min} (t) = \min_{1 \le i \le n} f_{x, i} (t) は凹関数となる.よって, x_{\max} - x_{\min} は凸関数同士の和となり凸関数である(凹関数  x_{\min} - x_{\min} は凸関数).また,この関数の値は非負である.したがって, x_{\max} - x_{\min} は非負の値をとる区分線形凸関数となる.同様に, y 軸についても考えると  y_{\max} - y_{\min} は非負の値をとる区分線形凸関数となる.

ここで,非負の値をとる2つの区分線形凸関数を  g_x = x_{\max} - x_{\min}, g_y = y_{\max} - y_{\min} とする.あとは, g_x \times g_y の最小値を求めればよい. g_x g_y は区分線形関数なので, g_x \times g_y の各区間は二次関数となる(∵  (a_1 x + b_1) \times (a_2 x + b_2) は2点  - \frac{b_1}{a_1}, -\frac{b_2}{a_2} を通る二次関数).
具体的に調べるべき区間は,与えられた点を移動方向で3つに分類したときに座標の最小値と最大値を与える点だけが重要で,それらの点が交差する時刻を昇順に並べたときの隣り合う時刻のすべての区間に対して三分探索で二次関数の最小値を求めればよい.各座標で移動方向は 3 パターンあり,それぞれの最小値と最大値を与える点の数は高々 2 個なので,調べるべき区間は高々  2 \binom{6}{2} = 30 通りしかない.

 
==========================================================================
下の説明は未証明(本当か嘘か分からない)
 g_x \times g_y は単峰関数(unimodal function)だと思うので,定義域を各区間ごとに分割して三分探索をせずに,十分大きな1つの区間として三分探索を行えば最小値が求まるはずなので,下の実装ではこの方針で AC した(たぶん反例がありそう).

 

計算時間 O(N \log T) T は定義域の最大値)

嘘解法っぽそうだけど単峰性から三分探索で最小値が求まるのではと思っているけど証明できず.