【[NOI2016]网格】

博客详细分析了NOI2016中关于网格问题的解决方案,讨论了答案可能的四种情况,并指出在大规模数据下直接判断的困难。通过建立特殊图结构并使用联通性检测来确定割顶。博主提醒,在判联通性时要注意避免特定的错误情况,提出了两种改进的四联通floodfill算法,以应对不同场景,确保正确性。
摘要由CSDN通过智能技术生成

一个显而易见的性质是答案不大于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又不难打࿰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值