Loading

2023 ICPC 亚洲区域赛济南站 G. Gifts from Knowledge

前言

模拟赛做到的, 破防了

思路

知道是一个大概什么做法, 我在考试思路的基础上继续想一下?

首先对于每一列, 我们可以求出哪些集合不共存, 经过 \(\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-\rm{SAT}\) 的形式, 考虑同样的处理即可


总结一下
首先, 这个题的每一行一定只有两种状态, 反转或者不反转
其次, 根据不同的方法可以得出一些二元的约束条件

总结

善于将约束条件甩到图上, 一般是边连接的两点必须同时满足这样的约束

没有发现集合大小不超过 \(2\) 这个性质
怎么最容易发现这个性质: 考虑无解情况

脑子要转过来, 两种状态必须有一种满足, 这是最重要的
而不是两种状态可以都不满足

posted @ 2025-01-07 15:49  Yorg  阅读(111)  评论(0)    收藏  举报