题解:CF2069B Set of Strangers

CF2069B

Statement

给定一个 \(n \times m\) 的矩阵,第 \(i\)\(j\) 列的方格颜色为 \(a_{i,j}\)

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

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

\(n,m \leq 700,\sum{n \cdot m} \leq 5 \times 10^5\)

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;
}
posted @ 2025-02-20 07:44  xAlec  阅读(67)  评论(0)    收藏  举报