1 条题解
-
0
题目概述
本题需要找出平面上 个点之间曼哈顿距离最小的前 条边。由于 可达 ,直接计算所有 对距离是不可行的。
核心思路
1. 曼哈顿距离转切比雪夫距离
通过坐标变换:
p[i].x = x + y, p[i].y = y - x;将曼哈顿距离 转换为切比雪夫距离 ,其中:
2. 二分答案 + 扫描线计数
二分框架:
i64 l = 0, r = 5e9; while (l < r) { i64 m = l + r >> 1; if (calcul_count(m) < K) { l = m + 1; } else { r = m; } }二分寻找第 小的距离值 。
3. 距离计数函数
calcul_count关键步骤:
-
预处理纵坐标范围:
void init_range(i64 d) { // 计算每个点在纵坐标方向上的有效范围 [yl[i], yr[i]] } -
扫描线计数:
- 按变换后的 坐标排序
- 维护滑动窗口,保证窗口内点的 坐标差不超过
- 使用树状数组统计纵坐标在有效范围内的点对数量
算法详解
坐标变换的意义
原始曼哈顿距离:
变换后坐标 下的切比雪夫距离:
由于 和 至少有一个等于 ,因此:
距离计数优化
对于固定的距离 ,点 和 满足距离 的条件是:
这转化为二维矩形区域查询问题,可以用扫描线 + 树状数组高效解决。
复杂度分析
- 坐标变换:
- 排序:
- 二分答案: 次
- 每次计数:
- 总复杂度:,可接受
关键优化技巧
- 坐标离散化:将纵坐标映射到 的整数范围
- 滑动窗口:利用 坐标的单调性
- 平衡树查询:使用
set高效查询纵坐标范围内的点 - 提前终止:计数达到 时立即返回
总结
该解法通过坐标变换将曼哈顿距离问题转化为更易处理的切比雪夫距离问题,结合二分答案和扫描线技术,在 的时间内高效解决了大规模Top-K曼哈顿距离查询问题。
- 1
信息
- ID
- 4959
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者