提交时间:2024-12-08 15:07:55

运行 ID: 35309

#include <bits/stdc++.h> using namespace std; namespace Br00k5xx { int n, m, k; int a[5005][5005], c[505][55][55]; int cc; int ans; int x[505], num[505]; int cnt[505]; int cur = 0; inline void prt() { // printf("cur:%d\n", cur); // printf("buc:"); // for (int i = 1; i <= cc; i++) // printf("%d ", cnt[i]); // puts(""); } int tms; inline void roll(int x1, int y1, int x2, int y2, int k) { // printf("roll %d %d %d %d\n", x1, y1, x2, y2); // printf("bef:\n"); // prt(); if (k == 1) { for (int i = x1; i <= x2; i++) { if (cnt[a[i][y1]] == num[a[i][y1]]) { cur--; } tms+=2; cnt[a[i][y1]]--; cnt[a[i][y2 + 1]]++; if (cnt[a[i][y2 + 1]] == num[a[i][y2 + 1]]) { cur++; } } } else { for (int i = x1; i <= x2; i++) { if (cnt[a[i][y2]] == num[a[i][y2]]) { cur--; } tms+=2; cnt[a[i][y2]]--; cnt[a[i][y1 - 1]]++; if (cnt[a[i][y1 - 1]] == num[a[i][y1 - 1]]) { cur++; } } } // printf("aft\n"); // prt(); } inline void rh(int x1, int y1, int x2, int y2) { for (int i = y1; i <= y2; i++) { if (cnt[a[x1][i]] == num[a[x1][i]]) { cur--; } tms+=2; cnt[a[x1][i]]--; cnt[a[x2 + 1][i]]++; if (cnt[a[x2 + 1][i]] == num[a[x2 + 1][i]]) { cur++; } } } inline void fd(int h, int w) { for (int i = 0; i <= cc; i++) cnt[i] = 0; // printf("find:%d %d\n", h, w); cur = 0; for (int i = 1; i <= h; i++) { for (int j = 1; j <= w; j++) { cnt[a[i][j]]++; if (cnt[a[i][j]] == num[a[i][j]]) cur++; tms++; } } int x1 = 1, y1 = 1, x2 = h, y2 = w; for (int i = 1; i <= n - h + 1; i++) { for (int j = 1; j <= m - w + 1; j++) { ans = min(ans, cc - cur); roll(x1, y1, x2, y2, 1); if (tms > 2e8) { printf("%d\n", ans); exit(0); } y1++, y2++; } for (int j = 1; j <= m - w + 1; j++) roll(x1, y1, x2, y2, -1), y1--, y2--; rh(x1, y1, x2, y2); x1++, x2++; } } signed main() { scanf("%d %d %d", &n, &m, &k); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &a[i][j]); if (!x[a[i][j]]) { cc++; x[a[i][j]] = cc; a[i][j] = cc; } else a[i][j] = x[a[i][j]]; num[a[i][j]]++; // printf("%d ", a[i][j]); } // puts(""); } num[0] = 0x3f3f3f3f; ans = cc; int lst = 0; for (int i = 1; i <= n; i++) { if (k / i < i) { lst = i; break; } if (k / i >= m) { if (k / (i + 1) < m) { fd(i, m); } } else { fd(i, k / i); } } for (int i = 1; i <= m; i++) { if (k / i < lst) break; if (k / i >= n) { if (k / (i + 1) < n) fd(n, i); } else fd(k / i, i); } printf("%d\n", ans); return 0; } } signed main() { Br00k5xx::main(); return 0; }