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 ...
随机推荐
- 洛谷p2375 kmp
题意 给你一个字符串,让你求一个\(num\)数组,\(num[i]\)为长度为\(i\)的前缀的公共前后缀长度不超过\(\lfloor \frac{i}{2}\rfloor\)的个数, 例如&quo ...
- nginx 配置文件 2019-12-20
cat /etc/nginx/nginx.conf user nginx; worker_processes ; error_log /var/log/nginx/error.log warn; p ...
- jQuery事件之解绑事件
语法: $(selector).unbind([eventType][,handler(eventObject)]); 返回值:jQuery 参数解释: eventTypey:类型:String以后包 ...
- Mybatis不使用Spring框架(Druid)
1.Mysql database CREATE TABLE mockrecord (id INT(10) unsigned PRIMARY KEY NOT NULL COMMENT 'mock记录编号 ...
- 石川es6课程---13-16、generator-认识生成器函数
石川es6课程---13-16.generator-认识生成器函数 一.总结 一句话总结: ` generator函数,中间可以停,到哪停呢,用 yield 配合,交出执行权 ` 需要调用next() ...
- vue 指示点的疑点拓展
1. 为什么 vue 组件中的 data 是一个函数 1. 为了保证组件的独立性和可复用性,data 是一个函数,组件实例的时候,这个函数将会被调用,返回一个对象,计算机会给这个对象分配一个内存地址, ...
- vue 混入 mixin,自定义指令,过滤器
vue 混入 mixin ,分发 vue 组件中重复的功能 局部的书写格式 // mixin.js var mymixin = { // 这是一个对象:对象里面的写法与组件里面的写法一模一样,组件该 ...
- koa 项目实战(四)注册接口和调试工具(postman)
1.安装模块 npm install koa-bodyparser --save npm install bcryptjs --save 2.引入模块 根目录/app.js const bodyPar ...
- 如何利用css进行网页布局
一.单列布局(类似于搜狐网站) 如: 代码为: 二.两列布局 1.固定宽度 代码为: 2.自适应 代码为: 三.三列布局 代码为: 四.混合布局 就是在前面的基础上,在进行划分块 如: 代码为:
- [net]tcp和udp&socket
参考 TCP和UDP连接 关于传输层TCP.UDP协议可能我们平时遇见的会比较多,有人说TCP是安全的,UDP是不安全的,UDP传输比TCP快,那为什么呢,我们先从TCP的连接建立的过程开始分析,然后 ...