제출 #1277355

#제출 시각아이디문제언어결과실행 시간메모리
1277355shirokitoDango Maker (JOI18_dango_maker)C++20
0 / 100
38 ms840 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 3000 + 24; int n, m; char a[N][N]; bool ok[N][N][2]; vector<int> g[N * N]; int tdfs = 0; int match[N * N], vis[N * N]; int id(int i, int j) { return (i - 1) * m + j; } bool kuhn(int u) { if (vis[u] == tdfs) return 0; vis[u] = tdfs; for (int v: g[u]) { if (match[v] == 0 || kuhn(match[v])) { match[v] = u; return 1; } } return 0; } void solve() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; } } int cnt_node = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (i + 2 <= n && a[i][j] == 'R' && a[i + 1][j] == 'G' && a[i + 2][j] == 'W') { ok[i][j][0] = 1; cnt_node++; } if (j + 2 <= m && a[i][j] == 'R' && a[i][j + 1] == 'G' && a[i][j + 2] == 'W') { ok[i][j][1] = 1; cnt_node++; } } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (!ok[i][j][1]) continue; if (ok[i][j][0]) g[id(i, j)].push_back(id(i, j)); if (i - 1 >= 1 && j - 1 >= 1 && ok[i - 1][j - 1][0]) g[id(i, j)].push_back(id(i - 1, j - 1)); if (i - 2 >= 1 && j - 2 >= 1 && ok[i - 2][j - 2][0]) g[id(i, j)].push_back(id(i - 2, j - 2)); } } for (int i = 1; i <= n * m; i++) { tdfs++; kuhn(i); } int cnt_match = 0; for (int i = 1; i <= n * m; i++) { if (match[i] != 0) cnt_match++; } cout << cnt_node - cnt_match << '\n'; } int main() { cin.tie(0) -> sync_with_stdio(0); int T = 1; // cin >> T; while (T--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...