1 条题解

  • 0
    @ 2025-11-4 11:39:30

    题目概述

    本题需要找出平面上 NN 个点之间曼哈顿距离最小的前 KK 条边。由于 NN 可达 250,000250,000,直接计算所有 O(N2)O(N^2) 对距离是不可行的。

    核心思路

    1. 曼哈顿距离转切比雪夫距离

    通过坐标变换:

    p[i].x = x + y, p[i].y = y - x;
    

    将曼哈顿距离 x1x2+y1y2|x_1-x_2| + |y_1-y_2| 转换为切比雪夫距离 max(x1x2,y1y2)\max(|x_1'-x_2'|, |y_1'-y_2'|),其中:

    • x=x+yx' = x + y
    • y=yxy' = 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;
        }
    }
    

    二分寻找第 KK 小的距离值 dd

    3. 距离计数函数 calcul_count

    关键步骤

    1. 预处理纵坐标范围

      void init_range(i64 d) {
          // 计算每个点在纵坐标方向上的有效范围 [yl[i], yr[i]]
      }
      
    2. 扫描线计数

      • 按变换后的 xx 坐标排序
      • 维护滑动窗口,保证窗口内点的 xx 坐标差不超过 dd
      • 使用树状数组统计纵坐标在有效范围内的点对数量

    算法详解

    坐标变换的意义

    原始曼哈顿距离:

    Δx+Δy|Δx| + |Δy|

    变换后坐标 (x+y,yx)(x+y, y-x) 下的切比雪夫距离:

    max(Δ(x+y),Δ(yx))=max(Δx+Δy,ΔyΔx)\max(|Δ(x+y)|, |Δ(y-x)|) = \max(|Δx+Δy|, |Δy-Δx|)

    由于 Δx+Δy|Δx+Δy|ΔyΔx|Δy-Δx| 至少有一个等于 Δx+Δy|Δx|+|Δy|,因此:

    max(Δx+Δy,ΔyΔx)=Δx+Δy\max(|Δx+Δy|, |Δy-Δx|) = |Δx| + |Δy|

    距离计数优化

    对于固定的距离 dd,点 iijj 满足距离 d\leq d 的条件是:

    • xixjd|x_i' - x_j'| \leq d
    • yiyjd|y_i' - y_j'| \leq d

    这转化为二维矩形区域查询问题,可以用扫描线 + 树状数组高效解决。

    复杂度分析

    • 坐标变换O(N)O(N)
    • 排序O(NlogN)O(N \log N)
    • 二分答案O(log(5×109))32O(\log (5\times 10^9)) \approx 32
    • 每次计数O(NlogN)O(N \log N)
    • 总复杂度O(NlogNlogMAX)O(N \log N \log \text{MAX}),可接受

    关键优化技巧

    1. 坐标离散化:将纵坐标映射到 [1,Y][1, Y] 的整数范围
    2. 滑动窗口:利用 xx 坐标的单调性
    3. 平衡树查询:使用 set 高效查询纵坐标范围内的点
    4. 提前终止:计数达到 KK 时立即返回

    总结

    该解法通过坐标变换将曼哈顿距离问题转化为更易处理的切比雪夫距离问题,结合二分答案和扫描线技术,在 O(NlogNlogMAX)O(N \log N \log \text{MAX}) 的时间内高效解决了大规模Top-K曼哈顿距离查询问题。

    • 1

    信息

    ID
    4959
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者