CF1799E 题解

题外话:本来没打这场,但同寝室的巨佬 @赵悦岑 在打,所以我说帮他口胡一下 E,结果我口胡出来的时候他还没过 B,而且一直到最后都没过!咳咳……

题意

给你一个 $n\times m$ 的矩阵,矩阵中有 .#,且 # 构成两个四连通块。请用尽量少的操作,将一些 . 改成 # 使得所有 # 构成一个四连通块,且任意两个 # 的最短路(只经过 # )为他们的曼哈顿距离。

分析

由题目要求,我们可以发现一些简单的性质:如果一个格子上下或左右都有 #,则他必定会被染成 #,否则无法满足条件。补充完这些后,如果此时只剩一个连通块,那么就做完了。否则继续考虑这个性质:对于上下左右四个边界,一定只会出现单峰的情况,而且剩下的两个连通块一定是左上-右下或右上-左下的,而且不会有某一行或某一列出现两个 # 属于不同连通块。现在我们只考虑左上-右下型的。一个显然的想法是先分别把左上的右下角补齐,把右下的左上角补齐,再用一条简单的路径把两个连通块连起来。举个例子,如果图是这样的:

1
2
3
4
5
6
7
###....
##.....
##.....
#......
......#
.....##
....###

那么我们补充完后可以是这样的:

1
2
3
4
5
6
7
###....
###....
###....
#####..
....###
....###
....###

不难证明,这样补充填充的 # 一定是最少的。

代码

有点长,放在这里