Submission #207847

#TimeUsernameProblemLanguageResultExecution timeMemory
207847opukittpceno_hhrDango Maker (JOI18_dango_maker)C++17
0 / 100
7 ms504 KiB
#include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <algorithm> #include <string> #include <cmath> #include <cstdio> #include <iomanip> #include <fstream> #include <cassert> #include <cstring> #include <unordered_set> #include <unordered_map> #include <numeric> #include <ctime> #include <bitset> #include <complex> #include <random> using namespace std; const int N = 3001; int a[N][N]; int read() { char c; cin >> c; if (c == 'R') return 0; if (c == 'G') return 1; if (c == 'W') return 2; assert(false); return -1; } int n, m; int ok(int i, int j, int dir) { if (dir == 0) { if (i == 0 || i + 1 == n) return 0; return a[i - 1][j] == 0 && a[i][j] == 1 && a[i + 1][j] == 2; } else { if (j == 0 || j + 1 == m) return 0; return a[i][j - 1] == 0 && a[i][j] == 1 && a[i][j + 1] == 2; } } vector<pair<int, int>> gt(int i, int j, int dir) { if (dir == 0) { return {{i - 1, j}, {i, j}, {i + 1, j}}; } else { return {{i, j - 1}, {i, j}, {i, j + 1}}; } } bool inter(vector<pair<int, int>> &x, vector<pair<int, int>> &y) { for (auto f : x) { for (auto s : y) { if (f == s) return 1; } } return 0; } vector<vector<int>> g; vector<int> used; vector<int> clr; void dfs(int v, int c) { clr[c] = 1; used[v] = 1; for (auto t : g[v]) { if (!used[t]) dfs(t, c ^ 1); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { a[i][j] = read(); // cout << a[i][j]; } // cout << endl; } vector<int> tk; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (ok(i, j, 0)) tk.push_back({i * m + j}); if (ok(i, j, 1)) tk.push_back({i * m + j + n * m}); } } // cerr << "tsz " << tk.size() << endl; // { // vector<pair<int, int>> v = gt(2, 1, 0); // for (auto [i, j] : v) { // cerr << i << ' ' << j << endl; // } // cerr << endl; // vector<pair<int, int>> v2 = gt(2, 2, 0); // for (auto [i, j] : v2) { // cerr << i << ' ' << j << endl; // } // cerr << endl; // cerr << inter(v, v2) << endl; // } auto get = [&](int x) { int v = tk[x]; int tp = (v / (n * m)); v %= n * m; int i = v / m; int j = v % m; return gt(i, j, tp); }; g.resize(tk.size()); used.resize(tk.size()); clr.resize(tk.size()); for (int i = 0; i < (int)tk.size(); i++) { for (int j = i + 1; j < (int)tk.size(); j++) { vector<pair<int, int>> f = get(i); vector<pair<int, int>> s = get(j); if (inter(f, s)) { g[i].push_back(j); g[j].push_back(i); } } } int f = (int)(tk.size()); { for (int i = 0; i < f; i++) { if (!used[i]) dfs(i, 0); } for (int i = 0; i < f; i++) { for (auto j : g[i]) { assert(clr[i] != clr[j]); } } } if (f > 20) { cout << "zopa" << endl; exit(0); } int ans = 0; for (int mask = 0; mask < (1 << f); mask++) { int ok = 1; for (int i = 0; i < f; i++) { if (((mask) >> i) & 1) { for (auto j : g[i]) { if ((mask >> j) & 1) ok = 0; } } } if (ok) ans = max(ans, __builtin_popcount(mask)); } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...