N - Expanded Hull Editorial
by
Mitsubachi
軽実装の解法
計算量は劣りますが,$3$ 次元凸包を軽い実装で得る方法を説明します.
一般に,「ある点 $p$ がある凸な立体 $v$ の中もしくは境界上に存在する」ということは $v$ を構成する各平面についてその平面より上にあるか下にあるか(場合によっては左にあるか右にあるか)の制約があり,そのすべての制約を満たすということです.なお,$p$ がある平面上にあるとき,その平面に関する制約を満たしているとします.
具体例として入力例 $1$ の凸包を考えると,$p = (x, y, z)$ が凸包の内部にあることは $x \geq 0, y \geq 0, z \geq 0, x + y + z \leq 1$ ということです.
例えば,凸包を構成する平面の $1$ つに $(0, 0, 0), (0, 1, 0), (0, 0, 1)$ を通る $x = 0$ が存在します.この平面より右側に $p$ が存在することが制約の $1$ つです.他には $(1, 0, 0), (0, 1, 0), (0, 0, 1)$ を通る $x + y + z = 1$ が存在し,この平面より下側に $p$ が存在することが制約の $1$ つです.
この例のように,境界となる平面と,その平面より上側にあるか下側にあるかの組を管理して $3$ 次元凸包を得ることを考えます.まず,$3$ 点を通る平面が境界となる条件は以下のように書けます.
「すべての点がその平面より上側もしくは平面上に存在する」または「すべての点がその平面より下側もしくは平面上に存在する」のいずれかを満たす.平面の方程式を $ax + by + cz + d = 0$ の形で管理すればある点が平面のどちら側にあるかは $ax + by + cz + d$ の $(x, y, z)$ に具体的な値を代入した際の符号により判定できます.
$3$ 点を通る平面は外積を用いれば $O(1)$ で計算できます.したがって,ある平面が凸包の境界となるか,もし境界となるならば制約はどうなるかは $O(N)$ で計算できます.平面の選び方は $O(N^3)$ 通りなので $O(N^4)$ で凸包の情報を得ることができます.
ここで,同一平面はその重複を取り除くことで平面の個数を $O(N)$ とできます.また,同一直線上の $3$ 点を選んだ場合,実装によっては平面の方程式が $0 = 0$ となり RE となりうるので注意してください.
後は,凸包の情報から凸包の \(k\) 倍拡大上にある格子点の個数を高々 \(4\) 回取得すれば多項式補間により解くことができます.(公式解説参照)
\((x, y)\) を固定したときに平面に関する制約は \(z\) の不等式で書くことができます.具体的には \(ax + by + cz + kd \leq 0\) もしくは \(ax + by + cz + kd \geq 0\) の形になります.
したがって \(M = \max \{ |x_i|, |y_i| \}\) とすると,\(k\) 倍拡大上にある格子点の個数は \(O(N k^2 M^2)\) で計算できます.
結論として,この問題は \(O(N^4 + NM^2)\) で解くことができます.なお,多項式補間で得られた \(K\) に関する多項式を観察すると \(K = 0\) で \(1\) となるため,\(k\) 倍拡大上にある格子点の個数を計算する回数を \(3\) 回とでき,定数倍の改善が見込まれます.
posted:
last update: