#include <bits/stdc++.h>
using namespace std;
int solve_one(int N, vector<vector<int>> F) {
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) F[i][j] = !F[i][j];
int latest[2][N][N];
for (int i = 0; i < N; i++) {
// left -> right
latest[0][i][0] = (F[i][0] ? 0 : -1);
for (int j = 1; j < N; j++) {
latest[0][i][j] = latest[0][i][j-1];
if (!F[i][j]) latest[0][i][j] = -1;
else if (latest[0][i][j] == -1) latest[0][i][j] = j;
}
// right -> left
latest[1][i][N-1] = (F[i][N-1] ? N-1 : -1);
for (int j = N-2; j >= 0; j--) {
latest[1][i][j] = latest[1][i][j+1];
if (!F[i][j]) latest[1][i][j] = -1;
else if (latest[1][i][j] == -1) latest[1][i][j] = j;
}
}
int ans = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!F[i][j]) continue;
int sm = 0;
int l, r;
// to left
l = latest[0][i][j], r = latest[1][i][j];
for (int k = i; k >= 0; k--) {
if (!F[k][j]) break;
l = max(l, latest[0][k][j]);
r = min(r, latest[1][k][j]);
sm += r-l+1;
}
// to right
l = latest[0][i][j], r = latest[1][i][j];
for (int k = i+1; k < N; k++) {
if (!F[k][j]) break;
l = max(l, latest[0][k][j]);
r = min(r, latest[1][k][j]);
sm += r-l+1;
}
ans = max(ans, sm);
}
}
return ans;
}
int biggest_stadium(int N, vector<vector<int>> F) {
vector<vector<int>> Ft(N, vector<int>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
Ft[j][i] = F[i][j];
}
}
return max(solve_one(N, F), solve_one(N, Ft));
}
# | 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... |