ABC351D
[ABC351D] Grid and Magnet
题意简述
给定一个
当这个格子上下左右有磁铁时你不能移动。
对于每个没有磁铁的单元格,将其自由度定义为从该单元格重复移动所能到达的单元格数。求网格中所有没有磁铁的单元格的最大自由度。(不一定一次性,只要有一种方案可达)。
称受磁铁影响的格子为禁地。(有去无回)
法1
分析
根据定义,能到达的单元格分为两类:
- 禁地。
- 非禁地。
平时做到的题目好像没有有去无回的,都是①双向连通,并查集就可以求最大连通块。
于是考虑先剔除禁地和磁铁格,可以将图分成好多个连通块,②连通块内的点彼此可达。
再来考虑禁地:对于每个连通块,四周禁地也是可达的(因为去到就行,不用回来),计入答案。
做法
先用并查集,然后枚举每个连通块内的所有点的周边禁地总数(去重)。
更好的做法是枚举禁地,向四周连通块贡献
可以考虑直接在维护并查集时维护 size
(存在差异,我们需要特判在同一个集合,否则会导致 size
计算出错,调了 1h 多)。
https://atcoder.jp/contests/abc351/submissions/52948232
法2
分析
答案至少是
朴素做法:从每个点出发搜索。
因此可以从非禁地(禁地反正是
性质:出发点必须是没有被遍历到过的点。(非禁地:①②,方案一样;禁地:动不了,反正
由于连通块四周禁地的存在,搜索时可能搜索到之前访问过的点,但是这些点必定是禁地,不影响复杂度。
较法1实现更简单,但是考虑的细节更多。(其实差不多)
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/18166695
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-04-29 小木棍
2023-04-29 斜率优化
2023-04-29 特别行动队