[NOIP2022] 建造军营
前言#
米奇妙妙
这种题看得懂想不出, 还是非常难蚌
能不能多想想再去看
算法#
思路 #
注意到除了割边, 其他的边都没有影响, 显然可以缩
这里发现缩完之后形成一棵树, 考虑树形
这里我有一个误区, 就是答案必须要是几个
对于树这种特殊结构,
因此令
首先考虑答案式子, 我们注意到, 答案应该是多种情况累加, 因为
注意到如果缩完点之后当前子树的大小为
这里有一个超级巨大的问题: 对于当前节点到父节点的边, 一定不能选, 因为对于父节点,
事实上如果最早就有关于答案式的思路, 可以通过手推样例/观察性质发现这种性质, 但是我还是大为震撼
所以答案为
太有实力啦
考虑递推
首先我们需要知道, 如果对于
所以有
初始化
注意这里表示的是只选
思路 #
考虑复习
感觉之前的做法过于巧妙, 遂决定重新理解一种更一般的做法
简化问题#
首先理解题意
求选出点集
和边集的方案数, 使得任意切断边集中的一条边, 点集中的点仍然联通
你发现如果切掉的不是割边, 一定没有用, 所以考虑先缩成一棵树, 这样留下来的边才有讨论价值
注意这样做会多出来一个
还需要注意的是, 现在的一个点可能在原图中表示多个点, 这个再计算时是需要处理的
以下用
好的, 经过上面的转换, 我们只需要解决这个问题的树上版本, 不难想到树形
分类讨论 + 转移#
记
第二个
和 的转移
不难发现
表示
最后处理
的转移
你发现其必然可以从
合并最后处理
分别表示
你发现这样子, 第三维的
令
不难有
最终
的转移
你发现这种情况下, 无所谓
合并最后处理
太乱了, 写了很久也不能用, 显然需要更具体一点, 上面的也不一定正确
合并子树 不考虑 节点 #
和
不难发现
不难发现
这个唯一比较复杂
首先是分成很多种情况
- 没选
-
只选一棵子树
此时 肯定不选
考虑记这种情况的方案数为 表示是否选了子树
转移类似需要注意的地方是, 初始化
时使用的 应当是还没有被更新的
然而你发现这样子「確有問題」, 具体在于除了最后一颗子树, 其他子树的系数 都不能表示「其他子树不选」, 所以我们需要对其进行修改
观察 的转移式, 我们考虑计算出
转移变为进一步的, 直接令
表示 -
所有选了点的子树都和
有连边 此时 不选 , 至少选两棵子树
这种情况只能正难则反, 考虑减去不合法的情况, 即减去一个都没选的方案数, 再减去只选了一个的方案数, 同上转移, 仅仅把系数 去掉即可, 还有把第三维改成
-
- 选
- 所有选了点的子树都和
有连边 此时 选
每个儿子可以任意选或者不选
- 所有选了点的子树都和
实现#
框架#
先计算各个边双联通分量的信息, 建好树之后如上开跑即可
代码#
在此之前先用数据验证算法正确性
总结#
神秘计数方法
注意计数不重不漏, 注意初始化
连通性问题常常要往缩点计数类的方向去想
缩点计数类问题一定要注意缩点带来的系数
一种合并类问题, 具体的套路在 之后的一篇文章 中有提到, 不在这里赘述
善于运用辅助数组避免新开一维或者更复杂的讨论
分类讨论能力必须加强, 考虑清楚每一维的含义
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效