Submission #1213893

#TimeUsernameProblemLanguageResultExecution timeMemory
1213893trimkusSoccer Stadium (IOI23_soccer)C++20
1.50 / 100
544 ms486712 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) {
            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;
            }
        }
    }
    vector<array<int, 4>> sz;
    for (int i = 0; i < N; ++i) {
        int now = 0;
        for (int j = 0; j < N;) {
            if (F[i][j] == 1) {
                j++;
                continue;
            }
            while (j < N && F[i][j] == 0) {
                now += 1;
                j++;
            }
            sz.push_back({now, j - now, j - 1, 0});
        }
    }
    for (int j = 0; j < N; ++j) {
        int now = 0;
        for (int i = 0; i < N;) {
            if (F[i][j] == 1) {
                i++;
                continue;
            }
            while (i < N && F[i][j] == 0) {
                now += 1;
                i++;
            }
            sz.push_back({now, i - now, i - 1, 1});
        }
    }
    vector<bool> done(2);
    sort(rbegin(sz), rend(sz));
    for (auto& [a, c, d, e] : sz) {
        if (done[e]) continue;
        done[e] = true;
        int from = c, to = d;
        if (e == 1) {
            for (int j = 0; j < N; ++j) {
                for (int i = 0; i < from; ++i) {
                    if (F[i][j] == 0) return 0;
                }
                for (int i = to + 1; i < N; ++i) {
                    if (F[i][j] == 0) return 0;
                }
            }
        } else {
            for (int i = 0; i < N; ++i) {
                for (int j = 0; j < from; ++j) {
                    if (F[i][j] == 0) return 0;
                }
                for (int j = to + 1; j < N; ++j) {
                    if (F[i][j] == 0) return 0;
                }
            
            }
        }
        cerr << a << " " << c << " " << d << " " << e << "\n";
    }

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