제출 #1227032

#제출 시각아이디문제언어결과실행 시간메모리
1227032MarwenElarbiSoccer Stadium (IOI23_soccer)C++17
30 / 100
155 ms416 KiB
#include "soccer.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second

int biggest(int N, std::vector<std::vector<int>> F){
    pair<int,int> tab[2][N];
    int ans=0;
    for (int i = 0; i < N; ++i){
        tab[0][i].fi=tab[1][i].fi=1e9;
        tab[0][i].se=tab[1][i].se=-1e9;
    }
    for (int i = 0; i < N; ++i)
    {
        bool test=false;
        bool test1=false;
        for (int j = 0; j < N; ++j)
        {
            if(F[i][j]==0){
                tab[0][i].fi=min(tab[0][i].fi,j);
                tab[0][i].se=max(tab[0][i].se,j);
                ans++;
            }
            if(F[i][j]==0){
                test=true;
            }
            if(F[i][j]==1&&test){
                test1=true;  
            } 
            if(F[i][j]==0&&test1) return 0;
        }
    }
    for (int i = 0; i < N; ++i)
    {
        bool test=false;
        bool test1=false;
        for (int j = 0; j < N; ++j)
        {
            if(F[j][i]==0){
                tab[1][i].fi=min(tab[1][i].fi,j);
                tab[1][i].se=max(tab[1][i].se,j);
            }
            if(F[j][i]==0) {
                test=true;
            }
            if(F[j][i]==1&&test) {
                test1=true;
            }
            if(F[j][i]==0&&test1) return 0;
        }
    }
    for (int i = 0; i < N; ++i)
    {
        if(tab[0][i].fi==1e9) continue;
        for (int j = 0; j < N; ++j)
        {
            if(tab[0][j].fi==1e9) continue;
            if (!((tab[0][i].fi<=tab[0][j].fi&&tab[0][i].se>=tab[0][j].se)||(tab[0][j].fi<=tab[0][i].fi&&tab[0][j].se>=tab[0][i].se))){
                return 0;
            }   
        }
    }
    for (int i = 0; i < N; ++i)
    {
        if(tab[1][i].fi==1e9) continue;
        for (int j = 0; j < N; ++j)
        {
            if(tab[1][j].fi==1e9) continue;
            if (!((tab[1][i].fi<=tab[1][j].fi&&tab[1][i].se>=tab[1][j].se)||(tab[1][j].fi<=tab[1][i].fi&&tab[1][j].se>=tab[1][i].se))){
                return 0;
            }   
        }
    }
    return ans;
}
int res=0;
int n;
vector<pair<int,int>> arr[10];
vector<pair<int,int>> cur;
void dfs(int x,int mn,int mx,bool test,bool test1){
    if(x==n) {
        vector<vector<int>> F(n,vector<int> (n));
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if(cur[i].fi<=j&&j<=cur[i].se) F[i][j]=0;
                else F[i][j]=1;
            }
        }
        res=max(res,biggest(n,F));
        return;
    }
    for(auto u:arr[x]){
        if(u!=make_pair(-1,-1)){
            if(test1) continue;
            if(max(mn,u.fi)>min(mx,u.se)) continue;
            cur.push_back(u);
            dfs(x+1,max(u.fi,mn) , min(u.se,mx),1,test1);
            cur.pop_back();
        }else{
            cur.push_back(u);
            dfs(x+1,mn,mx,test,(test ? 1 : 0));
            cur.pop_back();  
        }
    }
}
int biggest_stadium(int N, std::vector<std::vector<int>> F){
    n=N;
    for (int i = 0; i < N; ++i)
    {
        arr[i].push_back({-1,-1});
        bool test=false;
        for (int j = 0; j < N; ++j)
        {
            if(!test&&F[i][j]==0){
                arr[i].push_back({j,j});
                test=true;
            }if(test&&F[i][j]){
                arr[i].back().se=j-1;
                test=false;
            }
        }
        if(test) arr[i].back().se=N-1;
    }
    set<pair<int,int>> total;
    for (int i = 0; i < N; ++i)
    {
        for(auto u:arr[i]) total.insert(u);
    }
    for (int i = 0; i < N; ++i)
    {
        for(auto u:arr[i]){
            for(auto j:total){
                if(min(u.se,j.se)>=max(u.fi,j.fi)&&u!=j) arr[i].push_back({max(u.fi,j.fi),min(u.se,j.se)});
            }
        }
    }
    dfs(0,-1,n,0,0);
    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...