0%

LOJ3054 「HNOI2019」鱼

my AC submission

关于题意的补充说明

  • 令 $\alpha(0\le \alpha < 2\pi)$ 为 $\overrightarrow{DA}$ 逆时针旋转到 $\overrightarrow{DE}$ 经过的角度,$\beta ( 0\le \beta < 2\pi )$ 为 $\overrightarrow{DA}$ 逆时针旋转到 $\overrightarrow{DF}$ 经过的角度,那么题意中对 $\angle ADE, \angle ADF$ 的限制等价于:$\frac{1}{2} \pi < \alpha, \beta < \frac{3}{2} \pi$。
  • 可以参考我的这份O(n^6)暴力来确认自己没有读错题意。

Sol

枚举 $D$ 和 $A$,然后统计合法的 $B,C,E,F$ 的数量。

发现 $B,C$ 和 $E,F$ 是独立的,可以分别统计然后相乘。

统计 $B,C$ 的数量:某一对 $B,C$ 合法的充要条件是 $BC$ 的中垂线与 $AD$ 重合且交点(也就是 $BC$ 的中点)在线段 $AD$ 上(不含端点)。可以预先枚举所有的 $BC$,求出中垂线及中点并排好序,枚举 $AD$ 的时候直接在序列上二分即可。

统计 $E,F$ 的数量:枚举 $D$ 之后对其它点进行极角排序,扫描线维护。

总时间复杂度 $O(n^2 \log n)$。

实现细节:直线方程的处理

用 $Ax + Bx + C = 0(A,B,C \in \mathbb{Z})$ 的形式来表示直线。

求 $BC$ 的中垂线

对于一个在 $BC$ 中垂线上的点 $P$,它满足

带入点乘定义式即可。

求直线 $AD$

对于一个直线 $AD$ 上的点 $P$,它满足

带入叉乘的定义式即可。