ARC135D
构造 Xi=∑mj=1(−1)i+jAi,j,Yj=∑ni=1(−1)i+jAi,j。
则一个矩阵 B 能被矩阵 A 变成当且仅当 {X},{Y} 均相等。
必要性:很显然,因为操作是不会导致 {X} 或 {Y} 改变的。
充分性:对于 i∈[1,n−1],j∈[1,m−1],从上往下,从左到右依次调整,而每行的最右端与每列的最下端因为 {X},{Y} 均相等被唯一确定。
转换问题,变成给定 {X},{Y},满足 ∑Xi=∑Yj,求一个 B 满足 Xi=∑mj=1(−1)i+jBi,j,Yj=∑ni=1(−1)i+jBi,j,最小化 ∑|Bi,j|。
B 从全零矩阵开始操作,题目变成:
- 每次操作 (i,j,k),使得 Xi,Yj 加上 k,代价为 |k|,需要让 {X},{Y} 都变成 0,最小化代价。
显然有个下界是 ∑|Bi,j|≥max(∑|Xi|,∑|Yj|),接下来构造一组能取到下界的解。
- 如果存在 Xi,Yj>0,则操作 (i,j,−1)。
- 如果存在 Xi,Yj<0,则操作 (i,j,1)。
- 如果存在 Xi>0,Xj<0,则操作 (i,1,−1),(j,1,1)。
- 如果存在 Yi>0,Yj<0,则操作 (1,i,−1),(1,j,1)。
容易发现由于 ∑Xi=∑Yj,则前两种操作完后,必有 {X} 或 {Y} 全为 0,后面两种操作就是对剩下非 0 的进行处理,每一步都是必要且不浪费的,因此这样能取到下界。
时间复杂度 O(n2)。
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 505;
int n, m;
ll ans;
ll b[N][N];
ll X[N], Y[N];
void upd(int x, int y, ll c) {
X[x] -= c, Y[y] -= c;
b[x][y] += ((x + y) & 1) ? -c : c;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
ll k; scanf("%lld", &k);
if ((i + j) & 1) X[i] -= k, Y[j] -= k;
else X[i] += k, Y[j] += k;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (X[i] > 0 && Y[j] > 0)
upd(i, j, min(X[i], Y[j]));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (X[i] < 0 && Y[j] < 0)
upd(i, j, max(X[i], Y[j]));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (X[i] > 0 && X[j] < 0) {
ll tmp = min(X[i], -X[j]);
upd(i, 1, tmp);
upd(j, 1, -tmp);
}
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= m; ++j)
if (Y[i] > 0 && Y[j] < 0) {
ll tmp = min(Y[i], -Y[j]);
upd(1, i, tmp);
upd(1, j, -tmp);
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
ans += abs(b[i][j]);
printf("%lld\n", ans);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) printf("%lld ", b[i][j]);
printf("\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话