1 条题解
-
0
题解
问题转化
将棋盘建模为二分图:
- 左部 个顶点对应 行(记作 )
- 右部 个顶点对应 列(记作 )
- 每个按钮位于 对应一条边
设 表示边 是否被选中(1 为激活),则:
- 第 行激活按钮数
- 第 列激活按钮数
条件要求所有 相等,所有 相等,且这两个相等值相同(设均为 )。
奇偶性分析
记 为左部点 的度数(该行的按钮总数), 为右部点 的度数(该列的按钮总数)。
$$\sum_{e \in \delta(L_i)} x_e \equiv p \quad (\forall i),\qquad \sum_{e \in \delta(R_j)} x_e \equiv p \quad (\forall j) $$
在 (模 2 域)下,条件转化为:其中 表示与 关联的边集。
这是一个包含 个方程、 个变量的模 2 线性方程组。
方程组的可解性
所有左方程相加:$\sum_{i=1}^n \sum_{e \in \delta(L_i)} x_e \equiv n p \pmod 2$
所有右方程相加:$\sum_{j=1}^n \sum_{e \in \delta(R_j)} x_e \equiv n p \pmod 2$
这两个和都等于 ,因此得到 。- 若 为奇数,则 ,即 必须为 0(全偶数)
- 若 为偶数,则 可为 0 或 1
所以 的奇偶性决定了 的可能取值。
构造方法
对每个可能的 (0 或 1,由 奇偶性决定是否都需尝试),在二分图上求解模 2 方程组。
算法步骤:
- 建立二分图 ,边权 为未知数。
- 加入 个方程:
,。 - 注意到这些方程是线性相关的:所有左方程之和与所有右方程之和模 2 相等。
去掉一个冗余方程(例如最后一个右方程),剩下 个独立方程。 - 在 上高斯消元? 可达 ,不能直接消元。
巧妙构造:
将问题转化为在图中找一组边,使得每个顶点的度数奇偶性为 。
这是经典问题:在任意无向图中,给定每个顶点的目标奇偶性,判断是否存在边子集满足要求。构造算法(DFS 法):
- 从任意顶点开始 DFS。
- 当回溯到顶点 时,考虑其所有未被处理的邻边。
- 对每条边 ,递归处理 。
- 回溯时,检查 当前已决定的关联边中 的个数奇偶性是否等于目标奇偶性 。若不等,则选择边 (DFS 树边)使其翻转奇偶性。
- 最终每条边都被决定为 0 或 1。
这样可以在 时间内得到一组解(如果存在)。
非空解的处理
上述构造可能得到全 0 解(所有 ),但题目要求至少激活一个按钮。
若得到全 0 解:- 如果 :全 0 解不合法(奇偶性不满足),直接尝试另一种 或判断无解。
- 如果 :全 0 解符合奇偶性但按钮数为 0,需要调整。
调整方法:
若得到全 0 解,则任选一条边 ,将其设为 1。这会翻转其两个端点的度数奇偶性(从 0 到 1)。
在 为偶数时,可以再选一条与 无公共顶点的边 设为 1,使所有顶点奇偶性回到 0。
若找不到两条不相邻的边,则需检查是否存在非全 0 解:这等价于判断边集是否包含一个非空偶子图(所有顶点度数为偶数的子图),即是否存在偶环。
无解判断
如果对所有可能的 ,上述构造都无法得到非空解,则输出
NIE。
时间复杂度
- 建图:
- DFS 构造解:
- 检查非空解与调整:
- 总复杂度:,适合 。
关键点总结
- 二分图建模与模 2 方程组:将行列奇偶性约束转化为顶点度数奇偶性约束。
- 的奇偶性决定 的可能取值: 奇则 , 偶则 。
- DFS 回溯构造:在线性时间内求解模 2 方程组,避免高斯消元。
- 非空解保证:通过偶环检测或简单调整避免全 0 解。
- 子任务引导:子任务 2 和 3 分别要求 或 的解,提示了分情况构造的思路。
- 1
信息
- ID
- 5812
- 时间
- 8000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者