Submission #1229715

#TimeUsernameProblemLanguageResultExecution timeMemory
1229715vladiliusSoccer Stadium (IOI23_soccer)C++20
25 / 100
231 ms63360 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second

int biggest_stadium(int n, vector<vector<int>> FF){
    vector<vector<int>> F(n + 1, vector<int>(n + 1)), P(n + 1, vector<int>(n + 1));
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++){
            F[i][j] = FF[i - 1][j - 1];
            P[i][j] = P[i][j - 1] + !F[i][j];
        }
    }

    int M = 1e9, K = 0, C = 0;
    for (int i = 1; i <= n; i++){
        if (P[i][n]){
            M = min(M, i);
            K = max(K, i);
            C++;
        }
    }
    
    if (C != (K - M + 1)) return 0;
    
    vector<pii> all;
    
    int L = 0, R = 0, I = 0;
    for (int i = M; i <= K; i++){
        int mn = 1e9, mx = 0;
        for (int j = 1; j <= n; j++){
            if (!F[i][j]){
                mn = min(mn, j);
                mx = max(mx, j);
            }
        }

        if (P[i][n] != (mx - mn + 1)) return 0;
        
        
        all.pb({mn, mx});
        
        if (i == M){
            L = mn; R = mx;
        }
        else {
            if (!I){
                if (mn <= L && R <= mx){
                    L = mn; R = mx;
                }
                else {
                    if (L <= mn && mx <= R){
                        I = 1;
                        L = mn; R = mx;
                    }
                    else {
                        return 0;
                    }
                }
            }
            else {
                if (L <= mn && mx <= R){
                    L = mn; R = mx;
                }
                else {
                    return 0;
                }
            }
        }
    }
    
    auto cmp = [&](pii x, pii y){
        if (x.ff != y.ff) return x.ff < y.ff;
        return x.ss > y.ss;
    };
    
    sort(all.begin(), all.end(), cmp);
    for (int i = 0; i + 1 < all.size(); i++){
        if (all[i].ss < all[i + 1].ss){
            return 0;
        }
    }
    
    int out = 0;
    for (int i = 1; i <= n; i++) out += P[i][n];
    return out;
}
#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...