题解:CF2069B Set of Strangers
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;
}

浙公网安备 33010602011771号