一个显而易见的性质是答案不大于2(角上的跳蚤最多与两个相邻)
继而发现答案其实只可能是-1,0,1,2(废话),分类讨论:
-1:nm-c<2nm−c<2或者nm-c=2nm−c=2且剩下的两只跳蚤相邻;
0:原图不连通;
1:原图联通且有割顶;
否则为2。
但n,m\le 10^9n,m≤109这种数据范围肯定不能直接做了,发现只有蚱蜢周围的跳蚤可能是割顶,是不是可以把它们选出来建图呢?
hack:(以下均用#表示蚱蜢,*表示选出的跳蚤,.表示其余跳蚤)
.**
.*#
.**
中间的*成为假的割顶。因此,我们要向外扩展两圈,然后如果在第一圈内发现割顶,那么才真正发现了割顶。这个另外的题解也有讲,这里就不仔细说了。
但是判联通性也有许多大坑,但许多题解都没提,我来提一下或许是我太蒟了
首先是怎么判。不能直接在建好的图上判,举个栗子:
#**.**#
会被判为不连通。而真正的不连通具有什么性质呢?我们发现,障碍点(蚱蜢)会把它周围的点分成至少两个联通块,由此得到算法1:
对选出的结点进行四联通floodfill,检查每个障碍周围的点是否均属于同一个联通块。
这个方法已经可以通过官方数据了,但我们还有万恶的UOJ
我们发现这个方法是可以hack的:
*###*
每个结点周围只有一个联通块,联通,于是你WA的一声哭了出来,所以,我们必须将连在一起的障碍一起处理,得到算法2:
对选出的结点进行四联通floodfill,对障碍进行八连通floodfill,检查每个障碍块周围的点是否均属于同一个联通块。
注意,对结点的检查不能判重,比如下面的例子:
***
###
###
###
***
*#*
如果先检查了下面的#,再在检查上面的障碍块使省略重复访问,那么将返回联通。
这就没问题了。
至于实现么,反正map会被卡,hash又不难打