野花做了场玫瑰梦。|

_Tomori

园龄:5个月粉丝:7关注:11

题解:CF2069B Set of Strangers

CF2069B

Statement

给定一个 n×m 的矩阵,第 ij 列的方格颜色为 ai,j

如果两个方格并不共享边,我们称其为陌生的方格,对于一个又陌生的方格组成的集合,若该集合内方格元素均相同,我们可以将集合内的方格同意涂成另一种颜色。

你需要最少多少操作次数使得所有方格颜色相同。

n,m700,nm5×105

Solution

如果说有共享边且颜色相同的方格,显然操作次数会多一次,并且要涂掉一个颜色操作数不是 1 就是 2,因为如果同一颜色方格没有共享变一次就可以涂完。

开值域桶记每个颜色的操作数,统计操作数和减去最大操作数就是答案。

Code

#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int T, n, A[777][777], B[500005], m;

signed main() {
	scanf ("%d", &T);
	while (T --) {
		scanf ("%d %d", &n, &m);
		fill (B + 1, B + n * m + 1, 0LL);
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				scanf ("%d", &A[i][j]);
			}
		}
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				bool flag = false;
				for (int k = 0; k < 4; k ++) {
					int nx = i + dx[k], ny = j + dy[k];
					if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
					if (A[i][j] == A[nx][ny]) {
						flag = true;
						break; 
					}
				}
				B[A[i][j]] = max (B[A[i][j]], 1 + flag);
			}
		}
		int Sum = 0, tot = 0;
		for (int i = 1; i <= n * m; i ++) 
			tot = max (tot, B[i]), Sum += B[i];
		printf ("%d\n", Sum - tot);
	}
	return 0;
}

本文作者:Tomori's Blog

本文链接:https://www.cnblogs.com/Tomori0505/p/18725731

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   _Tomori  阅读(36)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起