Submission #1096991

#TimeUsernameProblemLanguageResultExecution timeMemory
1096991raphaelpGame (eJOI20_game)C++14
100 / 100
1 ms600 KiB
#include <bits/stdc++.h> using namespace std; int dfs(pair<int, int> init, pair<int, int> p, int x, int y, vector<string> &H, vector<string> &V, vector<vector<int>> &occ, int N, int M, vector<int> &ones, vector<int> &fours, vector<int> &eights) { occ[x][y] = 1; int tot = 1; if ((x > 0 && occ[x - 1][y] && H[x][y] == '0' && !(p.first == x - 1 && p.second == y)) || (x < N - 1 && occ[x + 1][y] && H[x + 1][y] == '0' && !(p.first == x + 1 && p.second == y)) || (y > 0 && occ[x][y - 1] && V[x][y] == '0' && !(p.first == x && p.second == y - 1)) || (y < M - 1 && occ[x][y + 1] && V[x][y + 1] == '0' && !(p.first == x && p.second == y + 1))) return -1; if (x > 0 && H[x][y] == '0' && !occ[x - 1][y]) tot += dfs(init, {x, y}, x - 1, y, H, V, occ, N, M, ones, fours, eights); if (x < N - 1 && H[x + 1][y] == '0' && !occ[x + 1][y]) tot += dfs(init, {x, y}, x + 1, y, H, V, occ, N, M, ones, fours, eights); if (y > 0 && V[x][y] == '0' && !occ[x][y - 1]) tot += dfs(init, {x, y}, x, y - 1, H, V, occ, N, M, ones, fours, eights); if (y < M - 1 && V[x][y + 1] == '0' && !occ[x][y + 1]) tot += dfs(init, {x, y}, x, y + 1, H, V, occ, N, M, ones, fours, eights); if ((tot == 1 || tot == 2) && init.first == x && init.second == y) { if (H[x][y] == '1' && H[x + 1][y] == '1' && V[x][y] == '1' && V[x][y + 1] == '1') tot = 0; else ones.push_back(-tot); return 0; } if (init.first == x && init.second == y) { if (tot < 1) eights.push_back(tot - 2); else fours.push_back(-tot); } if (tot < 1) return tot - 2; return tot; } int main() { int N, M; cin >> N >> M; vector<string> V(M + 1), H(N + 1); for (int i = 0; i <= N; i++) cin >> H[i]; for (int i = 0; i < N; i++) cin >> V[i]; vector<vector<int>> occ(N, vector<int>(M)); vector<int> fours, ones, eights; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (occ[i][j]) continue; int temp = dfs({i, j}, {i, j}, i, j, H, V, occ, N, M, ones, fours, eights); } } sort(ones.begin(), ones.end()); for (int i = 0; i < ones.size() / 2; i++) swap(ones[i], ones[ones.size() - i - 1]); sort(fours.begin(), fours.end()); for (int i = 0; i < fours.size() / 2; i++) swap(fours[i], fours[fours.size() - i - 1]); sort(eights.begin(), eights.end()); for (int i = 0; i < eights.size() / 2; i++) swap(eights[i], eights[eights.size() - i - 1]); vector<vector<vector<vector<int>>>> dp(2, vector<vector<vector<int>>>(ones.size() + 1, vector<vector<int>>(fours.size() + 1, vector<int>(eights.size() + 1, 123456789)))); dp[0][ones.size()][fours.size()][eights.size()] = 0; dp[1][ones.size()][fours.size()][eights.size()] = 0; for (int j = ones.size(); j >= 0; j--) { for (int k = fours.size(); k >= 0; k--) { for (int l = eights.size(); l >= 0; l--) { int dp1jk1l = 123456789, dp0jk1l = 123456789, dp1jkl1 = 123456789, dp0jkl1 = 123456789; if (dp[0][j][k][l] != 123456789) { if (j > 0) { if (dp[1][j - 1][k][l] == 123456789) dp[1][j - 1][k][l] = dp[0][j][k][l] - ones[j - 1]; dp[1][j - 1][k][l] = min(dp[1][j - 1][k][l], dp[0][j][k][l] - ones[j - 1]); } if (k > 0) { if (dp1jk1l == 123456789) dp1jk1l = dp[0][j][k][l] - fours[k - 1]; dp1jk1l = max(dp1jk1l, dp[0][j][k][l] - fours[k - 1]); if (dp0jk1l == 123456789) dp0jk1l = dp[0][j][k][l] + fours[k - 1] + 4; dp0jk1l = min(dp[0][j][k - 1][l], dp[0][j][k][l] + fours[k - 1] + 4); } if (l > 0) { if (dp1jkl1 == 123456789) dp1jkl1 = dp[0][j][k][l] - eights[l - 1]; dp1jkl1 = max(dp1jkl1, dp[0][j][k][l] - eights[l - 1]); if (dp0jkl1 == 123456789) dp0jkl1 = dp[0][j][k][l] + eights[l - 1] + 8; dp0jkl1 = min(dp0jkl1, dp[0][j][k][l] + eights[l - 1] + 8); } } if (dp[1][j][k][l] != 123456789) { if (j > 0) { if (dp[0][j - 1][k][l] == 123456789) dp[0][j - 1][k][l] = dp[1][j][k][l] + ones[j - 1]; dp[0][j - 1][k][l] = max(dp[0][j - 1][k][l], dp[1][j][k][l] + ones[j - 1]); } if (k > 0) { if (dp0jk1l == 123456789) dp0jk1l = dp[1][j][k][l] + fours[k - 1]; dp0jk1l = min(dp0jk1l, dp[1][j][k][l] + fours[k - 1]); if (dp1jk1l == 123456789) dp1jk1l = dp[1][j][k][l] - fours[k - 1] - 4; dp1jk1l = max(dp1jk1l, dp[1][j][k][l] - fours[k - 1] - 4); } if (l > 0) { if (dp0jkl1 == 123456789) dp0jkl1 = dp[1][j][k][l] + eights[l - 1]; dp0jkl1 = min(dp0jkl1, dp[1][j][k][l] + eights[l - 1]); if (dp1jkl1 == 123456789) dp1jkl1 = dp[1][j][k][l] - eights[l - 1] - 8; dp1jkl1 = max(dp1jkl1, dp[1][j][k][l] - eights[l - 1] - 8); } } if (k > 0) { if (dp[0][j][k - 1][l] == 123456789) dp[0][j][k - 1][l] = dp0jk1l; dp[0][j][k - 1][l] = max(dp[0][j][k - 1][l], dp0jk1l); if (dp[1][j][k - 1][l] == 123456789) dp[1][j][k - 1][l] = dp1jk1l; dp[1][j][k - 1][l] = min(dp[1][j][k - 1][l], dp1jk1l); } if (l > 0) { if (dp[0][j][k][l - 1] == 123456789) dp[0][j][k][l - 1] = dp0jkl1; dp[0][j][k][l - 1] = max(dp[0][j][k][l - 1], dp0jkl1); if (dp[1][j][k][l - 1] == 123456789) dp[1][j][k][l - 1] = dp1jkl1; dp[1][j][k][l - 1] = min(dp[1][j][k][l - 1], dp1jkl1); } } } } cout << dp[0][0][0][0]; }

Compilation message (stderr)

game.cpp: In function 'int main()':
game.cpp:53:17: warning: unused variable 'temp' [-Wunused-variable]
   53 |             int temp = dfs({i, j}, {i, j}, i, j, H, V, occ, N, M, ones, fours, eights);
      |                 ^~~~
game.cpp:57:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for (int i = 0; i < ones.size() / 2; i++)
      |                     ~~^~~~~~~~~~~~~~~~~
game.cpp:60:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |     for (int i = 0; i < fours.size() / 2; i++)
      |                     ~~^~~~~~~~~~~~~~~~~~
game.cpp:63:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for (int i = 0; i < eights.size() / 2; i++)
      |                     ~~^~~~~~~~~~~~~~~~~~~
#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...