#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... |