제출 #1277398

#제출 시각아이디문제언어결과실행 시간메모리
1277398shirokitoDango Maker (JOI18_dango_maker)C++20
100 / 100
1277 ms233044 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 3000 + 24; int n, m; char a[N][N]; int id[N][N]; vector<vector<int>> g; int tdfs = 0; vector<int> mr, vis; vector<bool> ml; bool ok(int i, int j, int dir) { if (dir == 0) { return (j + 2 <= m && a[i][j] == 'R' && a[i][j + 1] == 'G' && a[i][j + 2] == 'W'); } else { return (i + 2 <= n && a[i][j] == 'R' && a[i + 1][j] == 'G' && a[i + 2][j] == 'W'); } } bool kuhn(int u) { if (vis[u] == tdfs) return 0; vis[u] = tdfs; for (int v: g[u]) { if (mr[v] == 0 || kuhn(mr[v])) { mr[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 szL = 0, szT = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (ok(i, j, 0)) ++szL; if (ok(i, j, 1)) id[i][j] = ++szT; } } g.assign(szL + 1, vector<int>()); mr.resize(szT + 1, 0); vis.resize(szL + 1, 0); ml.resize(szL + 1, 0); szL = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (!ok(i, j, 0)) continue; szL++; if (ok(i, j, 1)) g[szL].push_back(id[i][j]); if (i - 1 >= 1 && j + 1 <= m && ok(i - 1, j + 1, 1)) g[szL].push_back(id[i - 1][j + 1]); if (i - 2 >= 1 && j + 2 <= m && ok(i - 2, j + 2, 1)) g[szL].push_back(id[i - 2][j + 2]); } } int cnt_match = 0; for (bool run = true; run;) { run = false; ++tdfs; for (int i = 1; i <= szL; i++) { if (!ml[i] && kuhn(i)) { run = true; cnt_match++; ml[i] = true; } } } cout << (szL + szT) - 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...