#P16495. [PM10938]离散凸包
[PM10938]离散凸包
题目背景
在一座无限延伸的网格城市中,每个街区都可以用一对整数坐标 表示,其中 是行号, 是列号。两个街区如果共享一条边,就可以在一步之内互相到达。
城市规划师已经选定了若干必须保留的街区。为了让这些街区之间的交通具有一种离散意义上的“凸性”,他希望补充尽量少的街区,使最终区域内任意两个街区之间,都存在一条完全位于区域内部的最短路线。
题目描述
我们考虑一个由正方形格子组成的无限平面。每个格子由一对整数 唯一确定,分别表示它的行号和列号。
两个格子相邻,当且仅当它们共享一条边。因此,格子 与下列四个格子相邻:
从格子 到格子 的一条路径,是一个格子序列:第一个格子是 ,最后一个格子是 ,且序列中任意两个相邻格子在网格上也相邻。
若一条路径使用的移动次数尽可能少,则称它为一条最短路径。两个格子之间可能存在多条不同的最短路径。
对于一个格子集合 ,若对其中任意两个格子 ,都至少存在一条从 到 的最短路径,其经过的所有格子都属于 ,则称 是离散凸的。
给定一个格子集合 ,请找到一个满足下列条件的集合 :
- ;
- 是离散凸的;
- 尽可能小。
你只需要输出最小可能的 。
输入格式
输入由一行或多行组成,并一直读到文件结束。
每一行包含若干个格子,相邻格子之间用一个空格分隔。每个格子的格式为:
x,y
其中 表示行号, 表示列号。
所有输入行中出现的格子共同构成集合 。
输出格式
输出一行一个整数,表示包含 的最小离散凸集的大小。
样例 1
输入
1,7 4,11 6,5 7,1 11,8
输出
26
解释
下面给出一种最小离散凸集。字符 # 表示原集合 中的格子,字符 X 表示为了构成离散凸集而加入的其他格子,字符 . 表示不在集合中的格子。
......#....
......X....
......X....
......XXXX#
......XX...
....#XXX...
#XXXXXXX...
.......X...
.......X...
.......X...
.......#...
该集合一共包含 个格子。
样例 2
输入
1000000000,1 1,1000000000
1,1 1000000000,1000000000
输出
1000000000000000000
解释
最小离散凸集是所有行号、列号都位于 内的格子,即一个 的正方形,共有 个格子。
样例 3
输入
1563,17653 793487,12
输出
809566
解释
对于仅有两个给定格子的情况,任意一条连接它们的最短路径本身就是一个离散凸包。
样例 4
输入
1643,152 2342,32 53425,2
52,235 234,6346 265,65 234,23
352,45 128,63
100,200
输出
266982
样例 5
输入
1,1
输出
1
数据范围与约定
- 输入包含 到 行;
- 每一行的长度为 到 个字符;
- 每个格子的坐标均为正整数,且满足 ;
- 坐标中不含前导零;
- 所有给出的格子互不相同;
- 给出的格子总数为 到 ;
- 答案保证可以用有符号 位整数存储。