1 条题解
-
0
题目理解
我们有一个 的矩阵 (每个元素是非负整数且 ),Bob 根据它生成了一个 的矩阵 ,其中:
$$b_{i,j} = a_{i,j} + a_{i,j+1} + a_{i+1,j} + a_{i+1,j+1} $$现在给出 ,要求还原出 。如果不可行,输出 NO;如果可行,输出 YES 和任意一个满足条件的 矩阵。
关键观察
1. 问题的线性特性
这是一个线性方程组问题:对于 个方程,要求 个未知数。由于方程数少于未知数个数,通常会有无穷多解(如果存在解的话)。
2. 变量自由度的分析
- 总未知数:
- 方程数:
- 自由变量数:
这表明我们可以先固定 个变量的值,然后通过方程组唯一确定其他变量。
算法设计
1. 基础构造
我们可以先固定最后一行和最后一列的值为 0:
然后从右下角开始递推:
$$a_{i,j} = b_{i,j} - a_{i,j+1} - a_{i+1,j} - a_{i+1,j+1} $$这样我们得到了一个初始解 。
2. 解的调整
观察发现,如果我们将矩阵进行"黑白染色"(类似国际象棋棋盘),对每个黑格加上 ,对每个白格减去 ,那么每个 的值不会改变(因为每个 子矩阵包含两个黑格和两个白格)。
具体来说,对于位置 :
- 如果 是奇数:
- 如果 是偶数:
这里 和 是我们引入的调整变量,但其中有一个自由度是冗余的(整体平移不变),实际自由度为 。
3. 约束转化为差分约束系统
我们需要确保所有 满足 。
对于每个位置 :
- 如果 是奇数:
- 如果 是偶数:
这可以重写为:
- 如果 是奇数:
- 如果 是偶数:
4. 构建图模型
我们将 和 看作图中的节点:
- 个 节点:编号 到
- 个 节点:编号 到
不等式 对应于从 到 的一条有向边,权值为 。
5. 求解差分约束系统
使用 Bellman-Ford 或 SPFA 算法判断是否存在解。如果存在负环,则无解;否则,我们可以得到一组 和 的值,进而计算出最终的 。
由于题目只需要任意一组解,我们可以固定 作为起点。
算法正确性
1. 构造的完备性
我们的构造方法涵盖了所有可能的调整:任何满足 矩阵的 矩阵都可以表示为 加上某种棋盘格调整。
2. 范围约束的充分性
差分约束系统完整编码了所有 的条件,因此得到的解一定满足要求。
3. 解的存在性判断
差分约束系统无解当且仅当图中存在负环,这对应了原始问题无解的情况。
复杂度分析
时间复杂度
- 构造初始解:
- 建图: 条边
- SPFA:最坏 ,但由于图比较稀疏,实际运行很快
对于 ,总复杂度可以接受。
空间复杂度
- 存储矩阵:
- 存储图: 条边
代码实现要点
1. 变量定义
const int MAXN = 300; int n, m; int a[MAXN+5][MAXN+5], b[MAXN+5][MAXN+5]; vector<pair<int, int>> E[MAXN*2+5]; // 邻接表2. 关键步骤
- 读取输入,构造初始解
- 根据 的奇偶性建立差分约束图
- 使用 SPFA 判断负环
- 输出结果或 "NO"
3. 注意事项
- 需要处理多组测试数据
- 注意数组大小( 个节点)
- 注意边界条件
算法标签
- 差分约束
- 最短路
- 构造
总结
本题通过巧妙的"黑白染色"观察,将矩阵还原问题转化为差分约束系统问题。算法充分利用了 矩阵的线性特性,通过固定部分变量和引入调整参数,将范围约束转化为图中的边权约束,最终通过最短路算法求解。
这种方法不仅能够判断解的存在性,还能构造出具体的解,完美满足了题目要求。
- 1
信息
- ID
- 3588
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者