一个长这样的网格图(坐标范围((Z,Z))):
一开始有些点是黑点,有些点是白点。
每次网格图会产生如下变化:选择恰好一个能改变颜色的格子将其改变,条件为:这个格子存在两个反色的相邻格子。
直到不能变化为止。
问最坏情况下,是否能全部染白,如果能变化次数最多是多少。
给出若干个初始黑点的坐标,初始黑点坐标范围为((0dots 499,0dots 499))。初始黑点点数最多为(500^2)。
有一说一这题不给个能卡掉明显错误贪心的样例,差评。
但题目确实难想,翻译着题解的证明尝试去理解。
首先想如何判断是否能全部染白。这里可以贪心:先将所有的操作都用于染黑,全部染黑之后再染白(显然这个情况下不会存在再染黑的情况)。如果最后全白了,说明可以。
但是如果这个做法套用到最长操作次数上,它就错了。原因在于在尽量染黑的过程中,可能出现染白后再染黑的情况。
搬下dyp博客的图:
最优可行解可以自己玩玩。
系统地定义答案的上限。定义(phi)为相邻的不同颜色的格子的个数。可以发现每次操作过后(phi)只会变成(phi-1)或(phi-3)。分别称其为好操作和坏操作。正确的做法应该最小化坏操作的次数。
定义(overline A)为黑点点集(A)在经过尽量染黑的操作之后形成的点集。
先尽量染黑,对于其中的每个连通块,假设它是(overline A)。那么处理完(A)的时候,最后一个点必须要用坏操作;而在中间处理的时候能够一直用好操作,除非:(A)是个triforce(题解发明的一个词,字典中似乎没有它的实际含义,也不知如何翻译……)。
(下面会给出证明)
triforce长这样:
就是(|A|=3),且(A)中的三个黑格子都是同一个白格子的邻居。
所以做法就是:先计算一开始的(phi),减去二倍连通块个数,减去二倍triforce的个数。
证明:如果没有triforce,那么不需要多余的坏操作。
以下证明是搬官网题解加上自己的一点点润色。
假设(A)是一个有至少两个格子的集合,满足:
- (overline A)无环。
- (overline A)联通。
- (A)不是triforce。
可以证明这里存在一个好操作,使得操作后的集合(A')仍然满足这三个性质。显然性质1一直成立(因为(overline {A'}subseteq overline A)),接下来证明后面两个性质。分类讨论:
存在一个白变黑的好操作。显然成立,做下去。
不存一个白变黑的好操作,但存在一个黑变白的好操作。假设(c)变白,因为不存在白变黑的好操作,所以(overline A setminus A)中每个格子在(A)有三个邻居。至少两个在(A setminus c),于是(overline A setminus A subseteq overline {A setminus c})。即(overline A setminus c setminus (A setminus c) subseteq overline {A setminus c}),因为(A setminus c subseteq overline {A setminus c}),所以(overline A setminus c subseteq overline {A setminus c})。
可以证明(overline {A setminus c})联通:(1)(c)是(overline A)的一个叶子,显然去掉后仍然联通;(2)(c)不是(overline A)的叶子,那么(c)至少有两个邻居,在集合(overline A setminus c)内,也在(overline {A setminus c})内,于是(c)也在(overline {A setminus c})内,得出(overline {A setminus c}=overline A)。
如果是个(A setminus c)是个triforce,那么(A)一定是个triforce加一个相邻的格子,这个情况下存在另一个(c),选了它仍然满足。那么一开始就选另一个(c)就好了。
如果不存在好操作,那么:(A)中的格子不相邻(如果相邻一定成大小不为(1)的树,一定有叶子结点满足在(A)中只有一个邻居),并且(overline A setminus A)被(A)包围。因为(A)至少有两个格子,且(overline A)联通无环,只能构造出triforce满足这个条件。
借用下官方题解的图以助于理解:
显然中间的黑色点必须要选。绿色点不能选因为没有点相邻,红色点不能选因为如果选了会出现环。
于是证完了。
怠惰,懒得写。