1 条题解
-
0
题解
题目分析
我们需要统计满足特定几何条件的六元组 的数量。条件包括长度相等、角度限制等。
关键思路
1. 几何条件转化
观察条件:
- 且 ⇒ 和 都在 的垂直平分线上
- ⇒ 在 的垂直平分线上
- 角度限制限制了点的相对位置关系
2. 核心算法框架
代码采用枚举中心点 + 极角排序 + 双指针计数的方法:
- 枚举点 D:作为鱼的身体中心点
- 极角排序:以 D 为原点,计算其他点的极角和距离
- 分类处理:按距离分组(同心圆),分别处理每个距离上的点
- 角度范围计数:利用双指针统计满足角度条件的点对
3. 算法步骤详解
预处理
for (int i = 1; i <= n; i++) { // 以点i作为D点 for (int j = 1; j <= n; j++) { // 计算相对坐标、极角、距离平方 x = a[j].x - a[i].x, y = a[j].y - a[i].y; b[j] = {atan2l(y, x), _hypot(x, y)}; // 极角,距离平方 } // 按距离排序,距离相同的按极角排序 }角度范围处理
关键函数
solve(m, d):m:当前距离上的点数d:距离平方- 使用双指针维护角度范围
- 统计满足角度条件的点对数量
尾巴计数
对于每个可能的 方向,统计合法的 和 组合:
- :以某个方向为 时,合法的 数量
- :以某个方向为 时,合法的 数量
4. 复杂度分析
- 外层循环枚举 :
- 内层排序:
- 双指针扫描:
- 总体复杂度:,在 时可接受
代码实现要点
- 极角处理:使用
atan2计算精确角度,处理各种象限 - 距离比较:使用距离平方避免浮点误差
- 角度范围:通过双指针维护 的角度窗口
- 组合计数:最后将 和 的组合数相乘
总结
本题通过几何分析将复杂的条件转化为相对位置关系,利用极角排序和双指针技术高效统计满足条件的点对组合。关键在于理解角度条件的几何意义,并将其转化为可计算的区间约束。
- 1
信息
- ID
- 3710
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者