Submission #1213881

#TimeUsernameProblemLanguageResultExecution timeMemory
1213881trimkus축구 경기장 (IOI23_soccer)C++20
3.50 / 100
561 ms486608 KiB
#include "soccer.h" #include <bits/stdc++.h> using namespace std; int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; int biggest_stadium(int N, std::vector<std::vector<int>> F) { auto can = [&](int i, int j) -> bool { return max(i, j) < N && min(i, j) >= 0 && F[i][j] == 0; }; vector<vector<bool>> vis(N, vector<bool>(N)); int cnt = 0, res = 0; auto dfs = [&](auto& dfs, int i, int j) -> void { vis[i][j] = 1; for (int k = 0; k < 4; ++k) { int ni = i + dx[k]; int nj = j + dy[k]; if (max(ni, nj) >= N || min(ni, nj) < 0 || vis[ni][nj] || F[ni][nj] == 1) continue; dfs(dfs, ni, nj); } }; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (!vis[i][j] && F[i][j] == 0) { dfs(dfs, i, j); cnt += 1; } res += (F[i][j] == 0); } } if (cnt > 1) return 0; vector<vector<int>> dp(N, vector<int>(N)); vector<vector<int>> left(N, vector<int>(N, -1)), right(N, vector<int>(N, -1)); vector<vector<int>> up(N, vector<int>(N, -1)), down(N, vector<int>(N, -1)); for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { dp[i][j] += F[i][j]; if (i) { dp[i][j] += dp[i - 1][j]; } if (j) { dp[i][j] += dp[i][j - 1]; } if (i && j) { dp[i][j] -= dp[i - 1][j - 1]; } if (F[i][j] == 0) { left[i][j] = j; up[i][j] = i; } if (j > 0) { if (left[i][j - 1] != -1) left[i][j] = left[i][j - 1]; } if (i > 0) { if (up[i - 1][j] != -1) up[i][j] = up[i - 1][j]; } } } for (int i = N - 1; i >= 0; --i) { for (int j = N - 1; j >= 0; --j) { if (F[i][j] == 0) { right[i][j] = j; down[i][j] = i; } if (j + 1 < N) { if (right[i][j + 1] != -1) right[i][j] = right[i][j + 1]; } if (i + 1 < N) { if (down[i + 1][j] != -1) down[i][j] = down[i + 1][j]; } } } // for (int i = 0; i < N; ++i) { // for (int j = 0; j < N; ++j) { // cerr << up[i][j] << " "; // } // cerr << "\n"; // } // cerr << "\n"; // for (int i = 0; i < N; ++i) { // for (int j = 0; j < N; ++j) { // cerr << down[i][j] << " "; // } // cerr << "\n"; // } // cerr << "\n"; // for (int i = 0; i < N; ++i) { // for (int j = 0; j < N; ++j) { // cerr << left[i][j] << " "; // } // cerr << "\n"; // } // cerr << "\n"; // for (int i = 0; i < N; ++i) { // for (int j = 0; j < N; ++j) { // cerr << right[i][j] << " "; // } // cerr << "\n"; // } // cerr << "\n"; auto calc = [&](int i1, int j1, int i2, int j2) -> int { if (i1 > i2) swap(i1, i2); if (j1 > j2) swap(j1, j2); cerr << "Now calculating, i = [" << i1 << ", " << i2 << "] and j = [" << j1 << " , " << j2 << "], got = "; int res = dp[i2][j2]; if (i1 > 0) res -= dp[i1 - 1][j2]; if (j1 > 0) res -= dp[i2][j1 - 1]; if (i1 > 0 && j1 > 0) res += dp[i1 - 1][j1 - 1]; cerr << res << "\n"; return res; }; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (F[i][j] == 1) { if (left[i][j] != -1 && right[i][j] != -1) { return 0; } if (up[i][j] != -1 && down[i][j] != -1) { return 0; } int cnt = 0; if (left[i][j] != -1) { if (up[i][j] != -1) { cnt = calc(up[i][j], left[i][j], i - 1, j - 1); } else if (down[i][j] != -1) { cnt = calc(down[i][j], left[i][j], i + 1, j - 1); } } else if (right[i][j] != -1) { if (up[i][j] != -1) { cnt = calc(up[i][j], right[i][j], i - 1, j + 1); } else if (down[i][j] != -1) { cnt = calc(down[i][j], right[i][j], i + 1, j + 1); } } if (cnt > 0) return 0; } } } return res; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...