Kick Start 2019 Round A Parcels
题目大意
\(R \times C\) 的网格,格子间的距离取曼哈顿距离。有些格子是邮局。现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少。
数据范围
- $ 1 \le R \le 250 $
- $ 1 \le C \le 250 $
- 100 组测试数据
- Time limit: 15 s
分析
显然可以二分答案。
几何视角
考虑平面上的整点(也称格点)。到一个格点的曼哈顿距离不大于 \(k\) 的所有格点的轮廓是一个旋转了 45° 的正方形( For any point, the set of points within a manhattan distance of K form a square rotated by 45 degrees.),或者叫菱形。
考虑所有离现有邮局的最短距离大于 \(k\) 的格点,简称「未覆盖点」,每个未覆盖点都关联着一个上一段所说的菱形。如果所有菱形的交集不为空,那么只要从交集中取一点作为新邮局即可。
这个方法的困难在于两个菱形的交集并不好计算。不过我们可以通过坐标变换,把原本的菱形变成正方形。正方形的交集是容易计算的。
这个变换在算法竞赛界称为曼哈顿距离转切比雪夫距离。
平面上两点 $ (x_1, y_1) \(,\) (x_2, y_2) $ 的契比雪夫距离定义为 \(\max(|x_1 - x_2|, |y_1 - y_2|)\) 。
对应的坐标变换是 \((x, y) \longrightarrow (x + y, x - y)\) 。
代数视角
上述坐标变换的根源是曼哈顿距离的定义:
两点 $ (x_1, y_1) \(,\) (x_2, y_2) $ 的曼哈顿距离无非是下述四个值中最大者
$ (x_1 - x_2) + (y_1 - y_2) \(
\) (x_1 - x_2) + (y_2 - y_1) \(
\) (x_2 - x_1) + (y_1 - y_2) \(
\) (x_2 - x_1) + (y_2 - y_1) \(
亦即
\)(x_1 + y_1) - (x_2 + y_2)\(
\)(x_1 - y_1) - (x_2 - y_2) \(
\)(x_2 - y_2) - (x_1 - y_1) \(
\)(x_2 + y_2) - (x_1 + y_1)$
四者的最大值。
于是有
\begin{equation}
|x_1 - y_1 | + |y_1 - y_2| = \max(|(x_1 + y_1) - (x_2 + y_2)|, |(x_1 - y_1) - (x_2 - y_2)|) \label{E:1}
\end{equation}
利用 \eqref{E:1} 式,我们可以从代数视角(而非几何视角)来解决这个问题。
不妨把新邮局的坐标视作 \((x_2, y_2)\),把现有邮局尚不能覆盖的点的坐标视作 \((x_1, y_1)\) 。
问题转化为
是否存在点 \((x_2, y_2)\),满足当 \((x_1, y_1)\) 取遍未覆盖点,\eqref{E:1} 的值始终不超过 \(k\),换言之 \eqref{E:1} 的最大值不超过 \(k\) 。
注意到,当 \eqref{E:1} 取最大值时,\(x_1 + y_1\),\(x_1 - y_1\) 必取最值(即取最大值或最小值)。
因此我们可以先遍历未覆盖点 \((x_1, y_1)\),算出 \(x_1 + y_1\),\(x_1 - y_1\) 的最值,再枚举所有可能的新邮局 \((x_2, y_2)\),求 \eqref{E:1} 式的最大值,进行判断。