AT_arc115_b [ARC115B] Plus Matrix 题解
AT_arc115_b [ARC115B] Plus Matrix 题解
题意
给定矩阵 \(C_{n \times n}\),求两个数列 \(A_n,B_n\),使得 \(C_{i,j}=A_i+B_j\)。
分析
画出一个表格来:
2 | 1 | 3 | |
---|---|---|---|
2 | 4 | 3 | 5 |
0 | 2 | 1 | 3 |
1 | 3 | 2 | 4 |
可以看出来,对于任意一列 \(j\),\(C_{*,j}\) 都存在有 \(B_j\) 的贡献。
那么我们可以贪心的考虑。如果有解的话,将每列的最小值作为 \(B_j\)。
也就是就是 \(C_{*,j}\) 减去 \(\min_{k=1}^n C_{k,j}\)。
然后考虑 \(A_i\) 是什么。
我们画出来现在的矩阵:
2 | 1 | 3 | |
---|---|---|---|
2 | 2 | 2 | 2 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
可以看出 \(A_i\) 就是剩下的 \(C_{i,*}\) 了。
无解判断
什么时候无解。有矛盾的时候无解。
看任意一列,都是 \(A\) 这个数列。
如果 \(A \neq A\) 那么就是无解。
翻译成人话就是每一列如果有不同的,就是无解。
总结思路
将每一列减去这一列的最小值。
减去的数作为 \(B_j\)。
然后剩下的数,如果每一列都不同的话,就是无解。
否则输出即可。
评测记录:https://atcoder.jp/contests/arc115/submissions/49387103
核心代码:
#define rep(i, n) for (decltype(n) i = 0; i < n; ++i)
#define gor(i, l, r) for (decltype(r) i = l; i < r; ++i)
#define rr read()
int main() {
int n = rr; vector<int> b(n, 1e9);
vector<vector<int>> c(n, vector<int>(n));
rep(i, n) rep(j, n) c[i][j] = rr, b[j] = min(b[j], c[i][j]);
rep(i, n) rep(j, n) if ((c[i][j] -= b[j]) != c[i][0]) printf("No\n"), exit(0);
printf("Yes\n");
rep(i, n) printf("%d%c", c[i][0], " \n"[i == n - 1]);
rep(i, n) printf("%d%c", b[i], " \n"[i == n - 1]);
return 0;
}
易错点
输出别反了。
本文来自博客园,作者:RainPPR,转载请注明原文链接:https://www.cnblogs.com/RainPPR/p/17974535/solution-at-arc115-b
如有侵权请联系我(或 2125773894@qq.com)删除。