제출 #1192904

#제출 시각아이디문제언어결과실행 시간메모리
1192904LucaLucaMDango Maker (JOI18_dango_maker)C++20
0 / 100
0 ms328 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cassert> using ll = long long; #define debug(x) #x << " = " << x << '\n' const int NMAX = 3000; char a[NMAX][NMAX]; int vertical[NMAX][NMAX], horizontal[NMAX][NMAX]; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n, m; std::cin >> n >> m; for (int i = 0; i < n; i++) { std::string s; std::cin >> s; for (int j = 0; j < m; j++) { a[i][j] = s[j]; } } std::vector<int> vertl, vertr; std::vector<std::pair<int, int>> edges; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { vertical[i][j] = horizontal[i][j] = -1; } } for (int i = 0; i + 2 < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] == 'R' && a[i + 1][j] == 'G' && a[i + 2][j] == 'W') { vertl.push_back(i * m + j); vertical[i][j] = vertical[i + 1][j] = vertical[i + 2][j] = i * m + j; } } } for (int i = 0; i < n; i++) { for (int j = 0; j + 2 < m; j++) { if (a[i][j] == 'R' && a[i][j + 1] == 'G' && a[i][j + 2] == 'W') { vertr.push_back(i * m + j); horizontal[i][j] = horizontal[i][j + 1] = horizontal[i][j + 2] = i * m + j; } } } for (int i = 0; i + 2 < n; i++) { for (int j = 0; j + 2 < m; j++) { if (vertical[i][j] != -1 && horizontal[i][j] != -1) { edges.push_back({vertical[i][j], horizontal[i][j]}); } } } std::sort(vertl.begin(), vertl.end()); vertl.erase(std::unique(vertl.begin(), vertl.end()), vertl.end()); std::sort(vertr.begin(), vertr.end()); vertr.erase(std::unique(vertr.begin(), vertr.end()), vertr.end()); int answer = 0; int L = (int) vertl.size(); int R = (int) vertr.size(); for (int mask = 0; mask < (1 << (L + R)); mask++) { int st = 0, dr = 0; std::vector<std::vector<int>> cnt(n, std::vector<int>(m, 0)); for (int i = 0; i < L + R; i++) { if (mask >> i & 1) { if (i < L) { int x = vertl[i] / m, y = vertl[i] % m; cnt[x][y]++; cnt[x + 1][y]++; cnt[x + 2][y++]; } else { int x = vertr[i - L] / m, y = vertr[i - L] % m; cnt[x][y]++; cnt[x][y + 1]++; cnt[x][y + 2]++; } } } bool ok = true; for (int i = 0; i < n && ok; i++) { for (int j = 0; j < m && ok; j++) { if (cnt[i][j] >= 2) { ok = false; } } } if (ok) { answer = std::max(answer, __builtin_popcount(mask)); } } std::cout << answer; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...