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} 式的最大值,进行判断。
Kick Start 2019 Round A Parcels的更多相关文章
- kick start 2019 round D T3题解
		
---恢复内容开始--- 题目大意:共有N个房子,每个房子都有各自的坐标X[i],占据每个房子需要一定花费C[i].现在需要选择K个房子作为仓库,1个房子作为商店(与题目不同,概念一样),由于仓库到房 ...
 - kick start 2019 round D T2题解
		
题目大意:由N个房子围成一个环,G个人分别顺时针/逆时针在房子上走,一共走M分钟,每分钟结束,每个人顺/逆时针走到相邻的房子.对于每个房子都会记录最后时刻到达的人(可能是一群人).最终输出每个人会被几 ...
 - Kick Start 2019 Round A Contention
		
$\DeclareMathOperator*{\argmax}{arg\,max}$ 题目链接 题目大意 一排 $N$ 个座位,从左到右编号 $1$ 到 $N$ . 有 $Q$ 个预定座位的请求,第 ...
 - Kick Start 2019 Round H. Elevanagram
		
设共有 $N = \sum_{i=1}^{9} A_i$ 个数字.先把 $N$ 个数字任意分成两组 $A$ 和 $B$,$A$ 中有 $N_A = \floor{N/2}$ 个数字,$B$ 中有 $N ...
 - Kick Start 2019 Round B Energy Stones
		
对我很有启发的一道题. 这道题的解法中最有思维难度的 observation 是 For simplicity, we will assume that we never eat a stone wi ...
 - 【DP 好题】Kick Start 2019 Round C Catch Some
		
题目链接 题目大意 在一条数轴上住着 $N$ 条狗和一个动物研究者 Bundle.Bundle 的坐标是 0,狗的坐标都是正整数,可能有多条狗住在同一个位置.每条狗都有一个颜色.Bundle 需要观测 ...
 - Kick Start 2019 Round F Teach Me
		
题目链接 题目大意 有 $N$ 个人,$S$ 项技能,这些技能用 $1, 2, 3, \dots, S$ 表示 .第 $i$ 个人会 $c_i$ 项技能($ 1 \le c_i \le 5 $).对于 ...
 - Kick Start 2019 Round D
		
X or What? 符号约定: $\xor$ 表示异或. popcount($x$) 表示非负整数 $x$ 的二进制表示里数字 1 出现的次数.例如,$13 = 1101_2$,则 popcount ...
 - Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解
		
Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解 题目地址:https://codingcompetitions.withgoogle.com/kickstar ...
 
随机推荐
- AcWing:164. 可达性统计(拓扑排序 + 状态压缩算法)
			
给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能 ...
 - mock的那点事
			
前言: Mock在GitHub上有12.9K的star可以看出,它在技术团队中是挺受欢迎的.这项技术被应用在不同领域的项目中. 适用场景: 下面我结合我们技术团队,列举最适合引入我们Mock服务的场景 ...
 - tomcat建立双向https安全连接
			
参考:http://www.hangge.com/blog/cache/detail_992.htmltomcat连接器的框架是coyote,有关信息参考:http://blog.csdn.net/w ...
 - 百度地图java 判断当前位置是否在多边形区域内
			
package com.haiyisoft.cAssistant.adapter.hessian; import java.awt.geom.Point2D;import java.util.Arra ...
 - 提问(prompt)
			
prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, str2); 参数说明: str1: ...
 - NodejS---require的机制
			
假设Y是路径,X是文件名或目录名,当 Nodejs 遇到 require(Y+X) 时,按照下面的顺序处理: 1.如果 X 是核心模块(例如:require("http")) a. ...
 - SSH开发中 使用超链接到action  其excute方法会被执行两次 actual row count: 0; expected: 1
			
由于执行两次excute,所以在做删除操作的时候会出现 Batch update returned unexpected row count from update [0]; actual row c ...
 - 网络通信框架之volley
			
介绍 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,Htt ...
 - 计算机组成原理 — CPU 中央处理器
			
目录 文章目录 目录 前文列表 逻辑电路部件 组合逻辑电路 时序逻辑电路 阵列逻辑电路 中央处理器(CPU) 控制单元(控制器) 运算单元(运算器) 存储单元(寄存器组和片内缓存) CPU 的工作原理 ...
 - jmeter beanShell修改http请求参数
			
jmeter beanShell修改http请求参数 在使用jmeter进行测试时,需要对上一步响应的明文参数,如userName='tom' token='%sdf%sdkdfj'之类的参数,加密一 ...