Description
给定 $n$ 个点,每个点的坐标为 $(x_i,y_i)$,且点 $(x,y)$ 到它周围 $8$ 个点
$(x-1,y)(x+1,y),(x,y-1),(x,y+1).(x-1,y+1),(x-1,y-1),(x+1,y+1),(x+1,y-1)$
的距离均为 $1$ 。现要找到一个点,使其它点到这个点的距离和最小,输出这个最小值。
$(0 \leq n \leq 10^5,-10^9 \leq x_i,y_i \leq 10^9)$
Source
Solution
很容易看出这道题属于 切比雪夫距离 的一般模型。即对于两个点 $(x_1, y_1),(x_2,y_2)$,它们之间的距离为
直接求 切比雪夫距离 似乎很困难?考虑把 切比雪夫距离 转化为 曼哈顿距离,即把每个点的坐标 $(x,y)$ 变为 $(\frac{x + y}{2}, \frac{x - y}{2})$ 。(详见 常用距离算法详解)
枚举所选的点 $i$,我们只需要计算其它点到它的曼哈顿距离和即可。
如果某个点 $j$ 的横坐标 $x_j \leq x_i$,则它的对总距离的贡献为 $x_i - x_j$,反之则为 $x_j - x_i$ 。
这样就可以分两种情况讨论了。
设前 $k$ 个点的横坐标都 $\leq x_i$,那么所有点横坐标的贡献和为
对于 $\sum\limits_{i = 1}^k x_i$ 和 $\sum\limits_{i = k+1}^n x_i$,我们可以预处理出 $x$ 的前缀和后 $O(1)$ 求得。
怎么求 $k$ 呢?显然可以将横坐标排序后二分得到。
纵坐标 $y$ 的计算方法与上面一样。时间复杂度为 $O(n \log n)$ 。
切比雪夫距离 转成 曼哈顿距离 时要除以 $2$,为了避免出现小数,我们可以横坐标和纵坐标同时乘上 $2$,最后答案除以 $2$ 。
Code
1 |
|