Submission #1229481

#TimeUsernameProblemLanguageResultExecution timeMemory
1229481vladiliusSoccer Stadium (IOI23_soccer)C++20
47.50 / 100
232 ms63372 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 ((n - P[i][n])){
            M = min(M, i);
            K = max(K, i);
            C++;
        }
    }
    
    if (C == (K - M + 1)){
        vector<pii> all;
        bool TT = 1;
        
        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 ((n - P[i][n]) != (mx - mn + 1)){
                TT = 0;
                break;
            }
            
            
            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 {
                            TT = 0;
                            break;
                        }
                    }
                }
                else {
                    if (L <= mn && mx <= R){
                        L = mn; R = mx;
                    }
                    else {
                        TT = 0;
                        break;
                    }
                }
            }
        }
        
        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){
                TT = 0;
            }
        }
        
        if (TT){
            int out = 0;
            for (int i = 1; i <= n; i++) out += (n - P[i][n]);
            return out;
        }
    }
    
    if (n > 7) return 0;
    
    int tot = 0, out = 0;
    vector<pii> all;
    function<void(int, int, int, bool)> gen = [&](int i, int l, int r, bool I){
        out = max(out, tot);
        if (i == n) return;
        if (!I){
            for (int l1 = 1; l1 <= l; l1++){
                for (int r1 = max(l1, r); r1 <= n; r1++){
                    if (P[i + 1][r1] == P[i + 1][l1 - 1]){
                        bool H = 0;
                        for (auto [L, R]: all){
                            if (L == l1 || R == r1) continue;
                            bool I1 = (l1 < L), I2 = (r1 < R);
                            if (I1 == I2){
                                H = 1;
                            }
                        }
                        
                        if (H) continue;
                        
                        all.pb({l1, r1});
                        tot += (r1 - l1 + 1);
                        gen(i + 1, l1, r1, 0);
                        tot -= (r1 - l1 + 1);
                        all.pop_back();
                    }
                }
            }
            for (int l1 = l; l1 <= r; l1++){
                for (int r1 = l1; r1 <= r; r1++){
                    if (P[i + 1][r1] == P[i + 1][l1 - 1]){
                        bool H = 0;
                        for (auto [L, R]: all){
                            if (L == l1 || R == r1) continue;
                            bool I1 = (l1 < L), I2 = (r1 < R);
                            if (I1 == I2){
                                H = 1;
                            }
                        }
                        
                        if (H) continue;
                        
                        all.pb({l1, r1});
                        tot += (r1 - l1 + 1);
                        gen(i + 1, l1, r1, 1);
                        tot -= (r1 - l1 + 1);
                        all.pop_back();
                    }
                }
            }
        }
        else {
            for (int l1 = l; l1 <= r; l1++){
                for (int r1 = l1; r1 <= r; r1++){
                    if (P[i + 1][r1] == P[i + 1][l1 - 1]){
                        bool H = 0;
                        for (auto [L, R]: all){
                            if (L == l1 || R == r1) continue;
                            bool I1 = (l1 < L), I2 = (r1 < R);
                            if (I1 == I2){
                                H = 1;
                            }
                        }
                        
                        if (H) continue;
                        
                        all.pb({l1, r1});
                        tot += (r1 - l1 + 1);
                        gen(i + 1, l1, r1, 1);
                        tot -= (r1 - l1 + 1);
                        all.pop_back();
                    }
                }
            }
        }
    };
    for (int i = 0; i < n; i++){
        tot = 0; all.clear();
        gen(i, n, 1, 0);
    }
 
    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...