Kick Start 2019 Round A Parcels

题目大意

R×C 的网格,格子间的距离取曼哈顿距离。有些格子是邮局。现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少。

数据范围

  • 1R250
  • 1C250
  • 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(|x1x2|,|y1y2|)

对应的坐标变换是 (x,y)(x+y,xy)

代数视角

上述坐标变换的根源是曼哈顿距离的定义:

两点 $ (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)$
四者的最大值。

于是有
(1)|x1y1|+|y1y2|=max(|(x1+y1)(x2+y2)|,|(x1y1)(x2y2)|)

利用 (1) 式,我们可以从代数视角(而非几何视角)来解决这个问题。

不妨把新邮局的坐标视作 (x2,y2),把现有邮局尚不能覆盖的点的坐标视作 (x1,y1)

问题转化为
是否存在点 (x2,y2),满足当 (x1,y1) 取遍未覆盖点,(1) 的值始终不超过 k,换言之 (1) 的最大值不超过 k

注意到,当 (1) 取最大值时,x1+y1x1y1 必取最值(即取最大值或最小值)。

因此我们可以先遍历未覆盖点 (x1,y1),算出 x1+y1x1y1 的最值,再枚举所有可能的新邮局 (x2,y2),求 (1) 式的最大值,进行判断。

posted @   Pat  阅读(317)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
点击右上角即可分享
微信分享提示