#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |