前言
模拟赛做到的, 破防了
思路
知道是一个大概什么做法, 我在考试思路的基础上继续想一下?
首先对于每一列, 我们可以求出哪些集合不共存, 经过 \(\mathcal{O} (nm)\) 的预处理之后问题转化为
给定 \(m\) 个集合, 要求选择的方案数使得选出的点集中, 不存在两个点在同一集合内
赛时想法结束
转化之后比较清楚, 怎么做
根本做不了, 红温了
还是要归来看正解思路
你发现如果第 \(i\) 列和第 \(m - i + 1\) 列总共的 \(1\) 的个数超过了 \(2\) , 那么显然无解
如果总共 \(1\) 的个数只有 \(1\) 个或 \(0\) 个, 那么显然不产生约束
否则我们假设两个 \(1\) 分别存在 \(u, v\) 行, 分类讨论约束
- 两个 \(1\) 位于同一列, \(u, v\) 的状态应当相同
- 两个 \(1\) 位于不同列, \(u, v\) 的状态应当相反
约束条件用图维护是简单的, 不再赘述
接下来是给赛时做法打补丁环节
我们知道如果单个集合的点数 \(> 2\) , 那么无论怎么搞都不可能有解, 具体的, 你一定要将至少两个点丢到另一个集合去, 会使得题目要求不再满足
如果单个集合的点数 \(< 2\) , 那么无论怎么搞都满足题意
所以我们将一个点数为 \(2\) 的集合视作单个的约束条件, 题意简化为
给定 \(m\) 条边, 求选点的方案数使得一条边所连两点不被同时选择
这样子做约束还是不够强, 无法计算答案, 必须想办法转化成所连两点必须被同时选择
好吧看来是救不活了
总结
善于将约束条件甩到图上, 一般是边连接的两点必须同时满足这样的约束
没有发现集合大小不超过 \(2\) 这个性质
怎么最容易发现这个性质: 考虑无解情况