Submission #442299

#TimeUsernameProblemLanguageResultExecution timeMemory
442299elazarkorenGame (eJOI20_game)C++17
0 / 100
1 ms204 KiB
#include <iostream> #include <vector> #include <algorithm> #define x first #define y second #define all(v) v.begin(), v.end() #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; typedef vector<bool> vb; typedef vector<vb> vvb; const int infinity = 1e9; int n, m; vvb hor_edge, ver_edge; inline int Val(int i, int j) { return i + j * n; } inline bool Inside(int i, int j) { if (i < 0 || i >= n || j < 0 || j >= m) return false; return hor_edge[i][j] && hor_edge[i + 1][j] && ver_edge[i][j] && ver_edge[i][j + 1]; } pii Dfs(vvi &graph, int node, vi &visited) { visited[node] = 1; int ans = 1; int edges = 2; for (int neighbor : graph[node]) { if (!visited[neighbor]) {//ans += Dfs(graph, neighbor, visited); pii p = Dfs(graph, neighbor, visited); ans += p.x; edges += p.y; } else if (visited[neighbor] == 1) { edges--; } } visited[node] = -1; return {ans, edges}; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m; hor_edge.resize(n + 1, vb(m)), ver_edge.resize(n, vb(m + 1)); for (int i = 0; i <= n; i++) { for (int j = 0; j < m; j++) { char c; cin >> c; hor_edge[i][j] = c == '1'; } } for (int i = 0; i < n; i++) { for (int j = 0; j <= m; j++) { char c; cin >> c; ver_edge[i][j] = c == '1'; } } vvi graph(n * m); vi visited(n * m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (i < n - 1 && !hor_edge[i + 1][j]) { graph[Val(i, j)].push_back(Val(i + 1, j)); graph[Val(i + 1, j)].push_back(Val(i, j)); } if (j < m - 1 && !ver_edge[i][j + 1]) { graph[Val(i, j)].push_back(Val(i, j + 1)); graph[Val(i, j + 1)].push_back(Val(i, j)); } if (hor_edge[i][j] && hor_edge[i + 1][j] && ver_edge[i][j] && ver_edge[i][j + 1]) { visited[Val(i, j)] = true; } } } vii components; for (int i = 0; i < n * m; i++) { if (!visited[i]) components.push_back(Dfs(graph, i, visited)); } components.push_back({0, 0}); if (components[0] > components[1]) swap(components[0], components[1]); if (components[0].x <= 2) { cout << components[1].x - components[0].x; } else { //if (components[0].y == components[0].x || components[1].y == components[1].x) { // cout << 8 - (components[0].x + components[1].x); //} else cout << 4 - (components[0].x + components[1].x); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...