1 条题解
-
0
D. 曼哈顿圆 – 详细题解
问题描述
给定一个 的网格,其中一些格子被标记为
#。已知这些#恰好构成了一个完整的曼哈顿圆,即存在一个圆心 和一个正整数半径 ,使得一个格子 是#当且仅当 。保证这样的圆存在且唯一。要求输出圆心的坐标 。关键性质
曼哈顿距离 可以写为:
$$|h-a| + |k-b| = \max\big( (h+k) - (a+b),\; (a+b) - (h+k),\; (h-k) - (a-b),\; (a-b) - (h-k) \big) $$但这个形式不如直接利用坐标变换来得简洁。引入新变量:
则曼哈顿距离变为:
$$|h-a| + |k-b| = \max\big( |u - (h+k)|,\; |v - (h-k)| \big) $$实际上,这是一个更常见的关系:在旋转 并缩放后的坐标系中,曼哈顿圆会变成轴对齐的正方形。具体来说,定义:
那么条件 等价于:
$$|U - (h+k)| < r \quad \text{且} \quad |V - (h-k)| < r. $$这是因为曼哈顿距离可以分解为两个一维的切比雪夫距离( 距离)的叠加。更严格地说:
$$|h-a| + |k-b| = \max\big( |(h+k)-(a+b)|,\; |(h-k)-(a-b)| \big). $$但上面等号并不成立?实际上,曼哈顿距离与切比雪夫距离之间有一个旋转关系:设 , ,则 吗?我们验证:取 , ,左边 ,右边 , , ;, , ,,成立。另一个例子:,左边 ,右边 , , ;, , ,。一般地,有恒等式:
$$|h-a|+|k-b| = \max\big( |(h+k)-(a+b)|,\; |(h-k)-(a-b)| \big). $$这个等式成立吗?考虑 ,左边 ,右边 , , ;, , ,,成立。再试 ,左边 ,右边 , ;, ,,成立。实际上,这个等式是正确的,因为:
$$|h-a|+|k-b| = \max_{s,t\in\{-1,1\}} \big( s(h-a) + t(k-b) \big) = \max\big( |(h+k)-(a+b)|,\; |(h-k)-(a-b)| \big). $$因此,曼哈顿圆 在 坐标系下变为:
其中 , 。即它是一个轴对齐的正方形(边长为 的整数格子点集)。
算法思路
因为网格上的
#点正好是这个正方形内的所有整数点(注意 , 的奇偶性: 和 同奇偶,因为 , 必须是整数。但题目保证存在完整的曼哈顿圆,意味着这些 恰好构成一个 的正方形(边界为 ,所以实际点集是 且 且满足同奇偶约束。但圆心 是整数,所以 和 同奇偶,正方形内的点自然满足同奇偶,因此所有满足不等式的格点都会出现。因此,我们只需要找到所有
$$U_{\min} = \min_{(a,b)\in \text{#}} (a+b),\quad U_{\max} = \max_{(a,b)\in \text{#}} (a+b), $$$$V_{\min} = \min_{(a,b)\in \text{#}} (a-b),\quad V_{\max} = \max_{(a,b)\in \text{#}} (a-b). $$#点对应的 和 的最小值和最大值,就可以确定正方形的范围:由于正方形关于中心对称,我们有:
$$U_0 = \frac{U_{\min} + U_{\max}}{2},\qquad V_0 = \frac{V_{\min} + V_{\max}}{2}. $$注意 和 的奇偶性相同(因为正方形内点的 值连续且步长为 ?实际上,如果圆心整数,则 整数,且 ,,它们的和是 ,是偶数,所以平均值是整数。同样 亦然。
最后,由 和 解得:
$$h = \frac{U_0 + V_0}{2},\qquad k = \frac{U_0 - V_0}{2}. $$由于 和 同奇偶, 均为整数。
实现步骤
- 读入网格,遍历每个格子。
- 如果格子是
#,计算 (注意坐标从 开始,即行号 ,列号 ),计算 。 - 维护 的最小值 和最大值 ,以及 的最小值 和最大值 。
- 计算 ,。
- 计算 ,。
- 输出 和 。
时间复杂度
每个测试用例需要扫描整个网格,即 。所有测试用例的总格子数不超过 ,因此总时间 ,非常快。
正确性证明
由曼哈顿圆的定义及坐标变换可知,所有
#点在 空间下构成一个轴对齐的正方形,其边界由极值唯一确定。因此,通过极值计算出正方形的中心 ,再逆变换即得圆心 。由于保证存在完整的曼哈顿圆,该过程必然得到正确结果。示例验证
以第一个样例: 网格,中间一个
#。那么 ,,则 ,,,,输出 ,正确。第二个样例:标准菱形。计算所有
#点的 和 极值,可得相同结果。结论
该解法利用了曼哈顿圆在 旋转坐标系下变为正方形的特性,通过极值快速求解圆心,实现简单且高效。
- 1
信息
- ID
- 6952
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者