Submission #442683

#TimeUsernameProblemLanguageResultExecution timeMemory
442683elazarkorenGame (eJOI20_game)C++17
60 / 100
1 ms264 KiB
#include <iostream> #include <vector> #include <algorithm> #include <bitset> #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) #define x first #define y second #define all(v) v.begin(), v.end() //#define short int using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<bool> vb; typedef vector<vb> vvb; typedef pair<int, int> pii; typedef vector<pii> vii; const int MAX_N = 21; const int infinity = 1e3; bitset<MAX_N> edges1[MAX_N], edges2[MAX_N]; //int id1[MAX_N][MAX_N], id2[MAX_N][MAX_N]; int n, m; inline bool IsEdge1(int i, int j) { if (edges1[i][j]) return true; return false; } inline bool IsEdge2(int i, int j) { if (edges2[i][j]) return true; return false; } inline bool Inside(int i, int j) { if (i < 0 || i >= n || j < 0 || j >= m) return false; return IsEdge1(i, j) && IsEdge1(i + 1, j) && IsEdge2(i, j) && IsEdge2(i, j + 1); } pii Dfs(vvi &graph, int node, vi &visited) { visited[node] = 1; int sz = 1, edge = 2; for (int neighbor : graph[node]) { if (!visited[neighbor]) { pii p = Dfs(graph, neighbor, visited); sz += p.x; edge += p.y; } else if (visited[neighbor] == 1) { edge--; } } visited[node] = -1; return {sz, edge}; } inline int Val(int i, int j) { return i * m + j; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m; char c; vvi graph(n * m); for (int i = 0; i <= n; i++) { for (int j = 0; j < m; j++) { cin >> c; if (c == '0') { if (i && i < n) { graph[Val(i, j)].push_back(Val(i - 1, j)); graph[Val(i - 1, j)].push_back(Val(i, j)); } } else { edges1[i][j] = true; } } } for (int i = 0; i < n; i++) { for (int j = 0; j <= m; j++) { cin >> c; if (c == '0') { if (j && j < m) { graph[Val(i, j)].push_back(Val(i, j - 1)); graph[Val(i, j - 1)].push_back(Val(i, j)); } } else { edges2[i][j] = true; } } } vii components; vi visited(n * m); for (int i = 0; i < n * m; i++) { if (!visited[i] && !Inside(i / m, i % m)) components.push_back(Dfs(graph, i, visited)); } int sz = components.size(); sort(all(components), [] (pii p1, pii p2) { if (p1.x <= 2 || p2.x <= 2) return p1.x < p2.x; // if (p1.x == p1.y) p1.x -= 2; // if (p2.x == p2.y) p2.x -= 2; if (p1.x - 2 * (p1.x == p1.y) == p2.x - 2 * (p2.x == p2.y)) return p1.x < p2.y; return p1.x - 2 * (p1.x == p1.y) < p2.x - 2 * (p2.x == p2.y); }); vi dp(sz); dp.back() = components.back().x; for (int i = sz - 2; i >= 0; i--) { dp[i] = -dp[i + 1] + components[i].x; if (components[i].x > 2) { if (components[i].x == components[i].y) { chkmax(dp[i], dp[i + 1] + components[i].x - 8); } else { chkmax(dp[i], dp[i + 1] + components[i].x - 4); } } } cout << -dp[0]; // int pow = 1 << sz; // vi dp(pow, infinity); // dp[0] = 0; // for (int i = 1; i < pow; i++) { // for (int j = 0; j < sz; j++) { // if (!((i >> j) & 1)) continue; // int sub = i - (1 << j); // if (components[j].x <= 2) { // chkmin(dp[i], -dp[sub] + components[j].x); // } else if (components[j].x == components[j].y) { // chkmin(dp[i], max(dp[sub] + components[j].x - 8, -dp[sub] + components[j].x)); // } else { // chkmin(dp[i], max(dp[sub] + components[j].x - 4, -dp[sub] + components[j].x)); // } // } // } // cout << -dp[pow - 1]; } //2 2 //11 //01 //11 //100 //100 //3 2 //00 //10 //11 //11 //011 //001 //000
#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...