叉积证明(应用:旋转卡壳)

叉积证明(应用:旋转卡壳)

例题 P1452 [USACO03FALL] Beauty Contest G

P1452 [USACO03FALL] Beauty Contest G

题目描述

给定平面上 \(n\) 个点,求凸包直径。

输入格式

第一行一个正整数 \(n\)

接下来 \(n\) 行,每行两个整数 \(x,y\),表示一个点的坐标。保证所有点的坐标两两不同。

输出格式

输出一行一个整数,表示答案的平方。

输入输出样例 #1

输入 #1

4
0 0
0 1
1 1
1 0

输出 #1

2

说明/提示

数据范围

对于 \(100\%\) 的数据,\(2\le n\le 5\times 10^4\)\(|x|,|y|\le 10^4\)


\(\text{upd 2022.7.22}\):新增加四组 Hack 数据。

思路

在求完逆时针排序的凸包后,直接逆时针双指针不断更新最大距离就行了。这里重点讲距离怎么求。
叉积可以算出向量 \(\vec a=(x_1,y_1)\)\(\vec b=(x_2,y_2)\) 所围成的平行四边形的面积(有正负),下面推其公式。

\[\begin{cases} x_1=r_1\cos\alpha\\ y_1=r_1\sin\alpha \end{cases}, \begin{cases} x_2=r_2\cos\beta\\ y_2=r_2\sin\beta \end{cases} \]

,则由几何关系,\(\vec a\times \vec b=r_1\cdot r_2\cdot\sin(\beta-\alpha)\) ,注意由于叉积是 \(\vec a\) 逆时针(逆时针是由于右手螺旋)转到 \(\vec b\) ,所以是 \(\beta-\alpha\)
简单拆一下式子,发现

\[\begin{aligned} \vec a\times \vec b&=r_1\cdot r_2\cdot\sin(\beta-\alpha)\\&=r_1\cdot r_2\cdot(\sin\beta\cos\alpha-\cos\beta\sin\alpha)\\ &=x_1y_2-y_1x_2 \end{aligned} \]

就这样了。

全文完