Official

M - Not Another Geometry Game! Editorial by platypus


\(\mathbb{R}^2\)の部分集合\(A\)について、\(A\)の凸包(\(A\)を含むような最小の凸集合)を\(f(A)\)\(f(A)\)の境界を\(\partial f(A)\)と書きます。今回の問題では、有限個の点集合\(P\),\(Q\)について、

\(\begin{aligned} M=\{\vec{p} + \vec{q}\ |\ \vec{p} \in P , \vec{q} \in Q\} \end{aligned}\)

とし、\(f(M)\)の面積を求めればよいです。(面積は最後に\(\frac{1}{4}\)倍することに注意)

この時、\(\partial f(P)\)\(n\)角形、\(\partial f(Q)\)\(m\)角形 (\(n,m \ge 2\))とすると、\(\partial f(M)\)\(n + m\)角形として以下のように求めることができます。

  1. \(\partial f(P)\)\(n\)個の辺を半時計回りに辿ったとき、それぞれの辺のベクトルを\(\vec{p_1}, \vec{p_2}, \cdots, \vec{p_n}\)とし、\(\partial f(Q)\)\(m\)個の辺も同様に\(\vec{q_1}, \vec{q_2}, \cdots, \vec{q_m}\)とする。

  2. \(\vec{p_1}, \vec{p_2}, \cdots, \vec{p_n},\vec{q_1}, \vec{q_2}, \cdots, \vec{q_m}\)を偏角順にソートし、\(\vec{r_1},\vec{r_2}, \cdots, \vec{r_{n+m}}\)とする。

  3. \(\vec{r_1},\vec{r_2}, \cdots, \vec{r_{n+m}}\)が求める\(\partial f(M)\)の辺を反時計回りに辿った時のベクトルとなる。

以上の手順によって正しく\(\partial f(M)\)が求まる理由は以下の通りです。

正当性の証明

$P$に含まれる$n$個の点の絶対座標を反時計回りに$\vec{P_1}, \vec{P_2}, \cdots, \vec{P_n}$、$Q$に含まれる$m$個の点の絶対座標を反時計回りに$\vec{Q_1}, \vec{Q_2}, \cdots, \vec{Q_m}$とします。
ここでは簡単のため、$\vec{p_i}=\vec{P_{i+1}}-\vec{P_i}$(ただし、$\vec{P_{N+1}}=\vec{P_1}$)とします。同様に、$\vec{q_i}=\vec{Q_{i+1}}-\vec{Q_i}$とします。

次に、ある有限個の点集合$A=\{\vec{A_i}\}$の凸包$f(A)$の性質を考えます。任意の$\theta \in [0,2\pi)$において、偏角が$\theta$である単位ベクトルを$\vec{e_\theta}$とします。すべての$i$について$\vec{A_i}$を$\vec{e_\theta}$に射影したときのベクトルは、ある実数$k_i$を用いて$k_i \vec{e_\theta}$と書けます。$k_i$の値が最大となる$i$であるとき、$\vec{A_{i}}$が$\partial f(A)$上に存在します。

これを今回の$P$と$Q$、及び$M$についても考えます。$P$の各点$\vec{P_i}$、$Q$の各点$\vec{Q_j}$をそれぞれ$\vec{e_\theta}$に射影し、そのベクトルをそれぞれ実数$a_i$、$b_j$を用いて$a_i\vec{e_\theta}$、$b_j\vec{e_\theta}$とします。 また、$M$に含まれる各点$\vec{P_i}+\vec{Q_j}$を$\vec{e_\theta}$に射影し、そのベクトルを実数$c_{i,j}$を用いて$c_{i,j} \vec{e_\theta}$と表記します。この時、射影の定義から、$c_{i,j}=a_i+b_j$が成り立つことがわかります。よって、$c_{i,j}$を最大化するには、$a_i$が最大となる$i$、$b_j$が最大となる$j$をそれぞれ使うのが最適であることがわかります。

$a_i$を最大化する$i$は、各$\vec{p_i}$の向きに注目することで求めることができます。具体的には、内積を用いて、$\vec{p_i} \cdot \vec{e_\theta}>0$と$\vec{p_j} \cdot \vec{e_\theta} \le 0$となる$i$を使えばよいです。$b_j$を最大化する$j$についても同様の方法で求められます。この$(i,j)$のペアは$\theta$に依存しますが、$0 \leq \theta \leq 2 \pi$の範囲で$i$は$n$回、$j$は$m$回変化するため、$(i,j)$ペアは高々$n+m$個しか存在しないことがわかります。また、各$(i,j)$ペアにおいて、$c_{i,j}$が最大となるような$\partial f(M)$上の頂点は、$\vec{A_i} + \vec{B_j}$です。

まとめると、$\partial f(M)$上の頂点は、ある$\theta$から導かれる$c_{i,j}$が最大となるような$i,j$があって、$\vec{A_i} + \vec{B_j}$のようにあらわせることがわかりました。$(i,j)$ペアの組み合わせは$n+m$通りあることから、$\partial f(M)$も$n+m$角形です。そして、$\vec{A_i} + \vec{B_j} = \sum_{n=1}^{i+j} \vec{r_n}$より、この手順で求めた$\vec{r_1}, \vec{r_2}, \cdots, \vec{r_{n+m}}$は求める多角形であることがわかります。

\(\vec{r_1},\vec{r_2}, \cdots, \vec{r_{n+m}}\)が求まった後は、その面積は、外積を用いて以下の式によって導出が可能です。

\(\begin{aligned} \sum_{i=1}^{n+m-1} |\vec{R_{i-1}} \times \vec{R_{i}}| \end{aligned}\)

(ただし、\(\vec{R_0} = \vec{0},\ \vec{R_i} = \sum_{j=1}^{i} \vec{r_j}\)

以上の手順はすべて\(O((n + m) \log (n + m))\)で行うことが可能です。今回は\(P\)\(Q\)の更新が動的に行われますが、\(\partial f(P)\)および\(\partial f(Q)\)の更新は、凸包の頂点が変化する部分のみの処理を行うことで、全体で\(O (N \log N)\)で行うことができます。面積を求める部分はセグメント木などで管理することにより、同じく全体の計算量を\(O (N \log N)\)で行うことができます。

posted:
last update: