Submission #442208

#TimeUsernameProblemLanguageResultExecution timeMemory
442208elazarkorenGame (eJOI20_game)C++17
0 / 100
1096 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]; } int Solve(bool player1, int sa, int st) { int ans = player1 ? -1 : infinity; for (int i = 0; i <= n; i++) { for (int j = 0; j < m; j++) { if (!hor_edge[i][j]) { hor_edge[i][j] = true; bool b1 = Inside(i, j); bool b2 = Inside(i - 1, j); if (player1) sa += b1 + b2; else st += b1 + b2; int val = Solve((b1 || b2) ? player1 : !player1, sa, st); if (player1) chkmax(ans, val); else chkmin(ans, val); hor_edge[i][j] = false; } } } for (int i = 0; i < n; i++) { for (int j = 0; j <= m; j++) { if (!ver_edge[i][j]) { ver_edge[i][j] = true; bool b1 = Inside(i, j); bool b2 = Inside(i, j - 1); if (player1) sa += b1 + b2; else st += b1 + b2; int val = Solve((b1 || b2) ? player1 : !player1, sa, st); if (player1) chkmax(ans, val); else chkmin(ans, val); ver_edge[i][j] = false; } } } if (ans == -1 || ans == infinity) return sa - st; return ans; } int Dfs(vvi &graph, int node, vb &visited) { visited[node] = true; int ans = 1; for (int neighbor : graph[node]) { if (!visited[neighbor]) ans += Dfs(graph, neighbor, visited); } return ans; } int main() { 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); vb visited(n * m); // int ans = 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; } } } cout << Solve(true, 0, 0); // vi components; // for (int i = 0; i < n * m; i++) { // if (!visited[i]) components.push_back(Dfs(graph, i, visited)); // } // sort(all(components)); // int sz = components.size(); // vi dp1(1 << sz, infinity); // vi dp2(1 << sz, infinity); // dp1[0] = dp2[0] = 0; // for (int i = 1; i < (1 << sz); i++) { // int sum = 0; // for (int j = 0; j < sz; j++) { // if ((i >> j) & 1) { // sum += components[j]; // chkmin(dp1[i], dp2[i - (1 << j)] + components[j]); // chkmin(dp2[i], dp1[i - (1 << j)] + components[j]); // } // } // dp1[i] = sum - dp1[i]; // dp2[i] = sum - dp2[i]; // } // int sum = 0; // for (int i = 0; i < sz; i++) sum += components[i]; // cout << dp1[(1 << sz) - 1] - (sum - dp1[(1 << sz) - 1]); // int sa = 0, st = 0; // for (int i = 0; i < components.size(); i++) { // if (i & 1) { // sa += components[i]; // } else { // st += components[i]; // } // } // cout << sa - st; // cout << -ans; 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...