QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: jiangly

Posted at: 2025-12-12 23:31:52

Last updated: 2025-12-12 23:31:56

Back to Problem

题解

假设我们枚举答案的方向 $v$($v$ 是单位向量),那么我们只需要让 $(\sum a,\sum b,\sum c)$ 和 $v$ 的点积最大,也就是选 $(a,b,c)\cdot v$ 最大的 $k$ 个。这个最大的点积设为 $f(v)$。那么对于所有 $v$,$f(v)$ 的最大值就是答案。

问题在于三维空间中我们没有办法高效枚举 $v$(在二维平面可以直接扫描极角转一圈)。但是我们可以去枚举 $f(v)$ 取到最大值时选择的集合。这个集合只有在某两个向量和 $v$ 的点积相对关系发生改变时变化。每对点相当于是在单位球面上画了一条线,这些线把球面分成了若干个区域,每个区域对应一个集合。为了枚举这些区域,我们去枚举所有多条线共点的情况,这包括三个点的公共平面以及两对点连线的平行平面(当然还有一些退化情况)。对于每个枚举的向量,我们还需要处理第 $k$ 大的值所在平面的相等的向量的顺序(相当于要在球面上的交点周围转一圈)。这其实就变成了二维的情况,极角扫描一圈或者再次枚举区域即可。

注意我们要处理第 $k$ 大的情况一定是某些点的公共平面,这也提示我们两对点连线的平行平面是不需要枚举的。如果一个平面是 $x$ 个点的公共平面,我们在后面的处理需要 $O(x^3\log n)$ 的时间。总时间复杂度 $O(n^4\log n)$。

Comments

No comments yet.