Submission #1223616

#TimeUsernameProblemLanguageResultExecution timeMemory
1223616nikdSoccer Stadium (IOI23_soccer)C++20
3.50 / 100
659 ms627552 KiB
#include "soccer.h"
#include <bits/stdc++.h>
using namespace std;

int biggest_stadium(int n, std::vector<std::vector<int>> F)
{
    vector<vector<bool>> vis(n, vector<bool>(n, 0));
    function<void(int, int)> dfs = [&](int i, int j){
        vis[i][j] = 1;
        if(i > 0 && !vis[i-1][j] && !F[i-1][j]) dfs(i-1, j);
        if(j > 0 && !vis[i][j-1]&& !F[i][j-1]) dfs(i, j-1);
        if(i < n-1 && !vis[i+1][j]&& !F[i+1][j]) dfs(i+1, j);
        if(j < n-1 && !vis[i][j+1]&& !F[i][j+1]) dfs(i, j+1);
        return;
    };
    int i0 = -1;
    int j0 = -1;
    int sol = 0;
    for(int i = 0; i<n; i++){
        for(int j = 0; j<n; j++){
            if(!F[i][j]){
                sol++;
                if(i0 == -1){
                    i0 = i; j0 = j;
                    dfs(i0, j0);
                }
                else{
                    if(!vis[i][j]) return 0;
                }
            }
        }   
    }

    vector<vector<int>> pref1(n, vector<int>(n));
    vector<vector<int>> pref2(n, vector<int>(n));
    for(int i = 0; i<n; i++){
        pref1[i][0] = F[i][0];
        pref2[0][i] = F[0][i]; 
    }
    for(int i = 0; i<n; i++){
        for(int j = 1; j<n; j++){
            pref1[i][j] = pref1[i][j-1]+F[i][j];
            pref2[j][i] = pref2[j-1][i]+F[j][i];
        }
    }
    auto q1 = [&pref1](int i, int ll, int rr)->int{
        if(ll>rr) swap(ll, rr);
        return pref1[i][rr]-(ll ? pref1[i][ll-1] : 0);
    };
    auto q2 = [&pref2](int i, int ll, int rr)->int{
        if(ll>rr) swap(ll, rr);
        return pref2[rr][i]-(ll ? pref2[ll-1][i] : 0);
    };
    int i1 = -1;
    for(int i = n-1; i>=0; i--){
        for(int j = 0; j<n; j++){
            if(!F[i][j]){
                i1 = i;
                break;
            }
        }
        if(i1 != -1) break;
    }
    vector<int> l(n, -1);
    vector<int> r(n, -1);
    for(int i = i0; i<=i1; i++){
        for(int j = 0; j<n; j++){
            if(!F[i][j]) l[i] = j;
        }
        for(int j = n-1; j>=0; j--){
            if(!F[i][j]) r[i] = j;
        }
        assert(l[i] != -1);
        if(q1(i, l[i], r[i]) != 0) return 0;
    }

    for(int i = 0; i<2*n; i++){
        for(int j =i+1; j<2*n; j++){
            int ii0 = i/2;
            int jj0 = (i&1 ? r[ii0] : l[ii0]);
            int ii1 = j/2;
            int jj1 = (j&1 ? r[ii1] : l[ii1]);
            //condizione 1: ii0, jj0 --> ii1, jj0 --> ii1, jj1
            int v1 = q2(jj0, ii0, ii1) + q1(ii1, jj0, jj1);
            //condizone 2: ii0, jj0 --> ii0, jj1 --> ii1, jj1
            int v2 = q1(ii0, jj0, jj1) + q2(jj1, ii0, ii1);
            if(v1 != 0 && v2 != 0) return 0; 
        }
    }
    return sol;
}
#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...