#P16495. [PM10938]离散凸包

[PM10938]离散凸包

题目背景

在一座无限延伸的网格城市中,每个街区都可以用一对整数坐标 (i,j)(i,j) 表示,其中 ii 是行号,jj 是列号。两个街区如果共享一条边,就可以在一步之内互相到达。

城市规划师已经选定了若干必须保留的街区。为了让这些街区之间的交通具有一种离散意义上的“凸性”,他希望补充尽量少的街区,使最终区域内任意两个街区之间,都存在一条完全位于区域内部的最短路线。

题目描述

我们考虑一个由正方形格子组成的无限平面。每个格子由一对整数 (i,j)(i,j) 唯一确定,分别表示它的行号和列号。

两个格子相邻,当且仅当它们共享一条边。因此,格子 (i,j)(i,j) 与下列四个格子相邻:

(i+1,j),(i1,j),(i,j+1),(i,j1).(i+1,j),\quad(i-1,j),\quad(i,j+1),\quad(i,j-1).

从格子 AA 到格子 BB 的一条路径,是一个格子序列:第一个格子是 AA,最后一个格子是 BB,且序列中任意两个相邻格子在网格上也相邻。

若一条路径使用的移动次数尽可能少,则称它为一条最短路径。两个格子之间可能存在多条不同的最短路径。

对于一个格子集合 SS,若对其中任意两个格子 A,BSA,B\in S,都至少存在一条从 AABB 的最短路径,其经过的所有格子都属于 SS,则称 SS离散凸的

给定一个格子集合 TT,请找到一个满足下列条件的集合 SS

  1. TST\subseteq S
  2. SS 是离散凸的;
  3. S|S| 尽可能小。

你只需要输出最小可能的 S|S|

输入格式

输入由一行或多行组成,并一直读到文件结束。

每一行包含若干个格子,相邻格子之间用一个空格分隔。每个格子的格式为:

x,y

其中 xx 表示行号,yy 表示列号。

所有输入行中出现的格子共同构成集合 TT

输出格式

输出一行一个整数,表示包含 TT 的最小离散凸集的大小。

样例 1

输入

1,7 4,11 6,5 7,1 11,8

输出

26

解释

下面给出一种最小离散凸集。字符 # 表示原集合 TT 中的格子,字符 X 表示为了构成离散凸集而加入的其他格子,字符 . 表示不在集合中的格子。

......#....
......X....
......X....
......XXXX#
......XX...
....#XXX...
#XXXXXXX...
.......X...
.......X...
.......X...
.......#...

该集合一共包含 2626 个格子。

样例 2

输入

1000000000,1 1,1000000000
1,1 1000000000,1000000000

输出

1000000000000000000

解释

最小离散凸集是所有行号、列号都位于 [1,109][1,10^9] 内的格子,即一个 109×10910^9\times10^9 的正方形,共有 101810^{18} 个格子。

样例 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

数据范围与约定

  • 输入包含 115050 行;
  • 每一行的长度为 115050 个字符;
  • 每个格子的坐标均为正整数,且满足 1x,y1091\le x,y\le 10^9
  • 坐标中不含前导零;
  • 所有给出的格子互不相同;
  • 给出的格子总数为 11300300
  • 答案保证可以用有符号 6464 位整数存储。