ARC135D

构造 Xi=mj=1(1)i+jAi,jYj=ni=1(1)i+jAi,j

则一个矩阵 B 能被矩阵 A 变成当且仅当 {X},{Y} 均相等。

必要性:很显然,因为操作是不会导致 {X}{Y} 改变的。

充分性:对于 i[1,n1],j[1,m1],从上往下,从左到右依次调整,而每行的最右端与每列的最下端因为 {X},{Y} 均相等被唯一确定。

转换问题,变成给定 {X},{Y},满足 Xi=Yj,求一个 B 满足 Xi=mj=1(1)i+jBi,jYj=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;
}
posted @   Kobe303  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示