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) \longleftrightarrow (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} 式的最大值,进行判断。

原文地址:https://www.cnblogs.com/Patt/p/11617460.html

时间: 2024-10-30 10:04:01

Kick Start 2019 Round A Parcels的相关文章

Kick Start 2019 - Round A A.Training 题解

题意 n个数中选出一组K个数,要求这一组数中所有数与这组数中最大值的差之和最小. 思路 很容易想到排序构造单调性,很容易想到利用前缀和降低复杂度. 把题意翻译成数学语言就是: $\sum_{j=i}^{i+K-1}a[i] - a[j] $ $=K*a[i] -\sum_{j=i}^{i+K-1}a[j]$ $=K*a[i]-(s[i+K-1]-s[i-1])?$ 化简式子之后就可以线性做了. 代码 1 #define inf 1000000000 2 int n,K; 3 LL a[N]; 4

【DP 好题】Kick Start 2019 Round C Catch Some

题目链接 题目大意 在一条数轴上住着 $N$ 条狗和一个动物研究者 Bundle.Bundle 的坐标是 0,狗的坐标都是正整数,可能有多条狗住在同一个位置.每条狗都有一个颜色.Bundle 需要观测 $K$ 条狗.要观测一条狗 Bundle 必须走到狗的住处,并且穿着和狗同色的衣服.Bundle 只能在家换衣服.试问 Bundle 至少要走多长的路程?注意:最后 Bundle 不必回到住处. Constraints 不超过 100 组测试数据 $ 1 \le N \le 1000 $ $ 1

Round G 2019 - Kick Start 2019

https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e02/000000000018fd0d Book Reading (10pts, 15pts) 1 ≤ T ≤ 100.1 ≤ P1 < P2 < ... < PM ≤ N.1 ≤ Ri ≤ N, for all i. Test set 1 (Visible) 1 ≤ M ≤ N ≤ 1000.1 ≤ Q ≤ 1000. Test set 2 (

Google Code Jam 2019 Round 1A 题解

A. Alien Rhyme 题意: 思路:将字符反向插入一颗Trie,然后自下而上的贪心即可,即先选后缀长的,再选后缀短的. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <iomanip> 5 6 #include <vector> 7 #include <cstring> 8 #include <string>

Google Kick Start 2018 Round C Planet Distance

思想: 1.用邻接表建图. 2.建完图之后,先把图中的环给找出来. 怎么找呢? (1)先统计每一个节点的度.   (2)统计完了之后,通过使用队列,把度为1 的点给剔除.每剔除一个,所谓剔除其实就是用一个dis[] 数组来做标记,其相应的邻居的度减一,如果该邻居的度为1了,那么把它加到队列里,重复上述过程,直到队列为空. (3)最后统计一下,剩下的就是环里的元素. 3.再对环里的元素用BFS搞一下,往外扩散.记录距离. AC 代码如下: import java.util.ArrayList; i

Google Kick Start 2020 Round A

Allocation 题意 N个房子出售,每个卖Ai刀,现有B刀资金,求最多买多少个. 思路 贪心,排序后从小到大买 代码 #include<bits/stdc++.h> using namespace std; const int MAX=1e5+5; int a[MAX]; int main() { int T,cas=0; scanf("%d",&T); while(T--) { int n,b,res=0; scanf("%d%d",&a

HYNB Round 15: PKU Campus 2019

HYNB Round 15: PKU Campus 2019 C. Parade 题意 将平面上n*2个点安排在长度为n的两行上. 做法 首先可以忽略每个点之间的影响,只用考虑匹配即可 然后把所以点归约到两行上,再从左到右依次考虑即可(考虑每条分界线被经过多少次) 比赛时被贪心治了... G. Go and Oreo 题意 把n*n个格子黑白染色后,数奥利奥 做法 按格考虑,简易版轮廓线DP 赛中一直在按行考虑,然后就不会了 HYNB Round 15: PKU Campus 2019 原文地址

Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) C. Vasya and Golden Ticket

C. Vasya and Golden Ticket time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Recently Vasya found a golden ticket - a sequence which consists of nn digits a1a2-ana1a2-an. Vasya considers a ti

Technocup 2019 - Elimination Round 2

http://codeforces.com/contest/1031 (如果感觉一道题对于自己是有难度的,不要后退,懂0%的时候敲一遍,边敲边想,懂30%的时候敲一遍,边敲边想,懂60%的时候敲一遍,边敲边想,(真实情况是你其实根本不用敲那么多遍--),然后,这道题你就差不多可以拿下了ψ(`?′)ψ) (IO模板在最后的蛋里) A. Golden Plate n*m矩形,最外圈为第一圈,间隔着选k个圈,问总共占多少给格子 每圈贡献=2n'+2m'-4,圈圈长宽以-4递减下去 public sta