#include "soccer.h"
#include <bits/stdc++.h>
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef vector<int> vi;
int n,maxi;
bool xd=true;
vector<vi> mat;
vector<pair<int,int>> trees;
void solve(int x,int y){
    if(x>n){
        int con=0;
        vector<vi> psum;
        psum.assign(n+2,vi(n+2,0));
        for(int i=1;i<=n;i++){
            int j=1;
            for(;j<=n && mat[i][j]==1;j++);
            for(;j<=n && mat[i][j]==0;j++);
            for(;j<=n && mat[i][j]==1;j++);
            if(j<=n){
                xd=false;
            }
        }
        for(int i=1;i<=n;i++){
            int j=1;
            for(;j<=n && mat[j][i]==1;j++);
            for(;j<=n && mat[j][i]==0;j++);
            for(;j<=n && mat[j][i]==1;j++);
            if(j<=n){
                xd=false;
            }
        }
        vector<pair<int,int>> hori(n+2),vert(n+2);
        if(xd){
            for(int i=0;i<=n+1;i++){
                int j=0;
                for(;j<=n+1 && mat[i][j]==1;j++);
                hori[i].first=j-1;
                j=n+1;
                for(;j>=0 && mat[i][j]==1;j--);
                hori[i].second=j+1;
            }
            for(int i=0;i<=n+1;i++){
                int j=0;
                for(;j<=n+1 && mat[j][i]==1;j++);
                vert[i].first=j-1;
                j=n+1;
                for(;j>=0 && mat[j][i]==1;j--);
                vert[i].second=j+1;
            }
            for(int i=1;i<=n+1;i++){
                for(int j=1;j<=n+1;j++){
                    psum[i][j]=psum[i-1][j]+psum[i][j-1]-psum[i-1][j-1]+(mat[i][j]==0?1:0);
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(mat[i][j]==0){
                        con++;
                        //izquierda arriba;
                        //hori[i].first vert[i].first;
                        if(psum[vert[j].first][hori[i].first]>0){
                            xd=false;
                        }
                        //izquierda abajo;
                        if(psum[n][hori[i].first]-psum[vert[j].second-1][hori[i].first]-psum[n][0]+psum[vert[j].second-1][0]>0){
                            xd=false;
                        }
                    }
                }
            }
            if(xd){
                maxi=max(maxi,con);
            }
        }
        return;
    }
    if(y>n){
        solve(x+1,1);
        return;
    }
    if(mat[x][y]==0){
        solve(x,y+1);
        mat[x][y]=1;
        solve(x,y+1);
        mat[x][y]=0;
    }
}
int biggest_stadium(int N,vector<vi> F)
{
    n=N;
    mat.assign(n+2,vi(n+2,1));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            mat[i][j]=F[i-1][j-1];
            if(mat[i][j]){
                trees.push_back({i,j});   
            }
        }
    }
    if(trees.size()==0){
        return n*n;
    }else if(trees.size()==1){
        int x=max(trees[0].first-1,n-trees[0].first);
        int y=max(trees[0].second-1,n-trees[0].second);
        return (x+y)*n-x*y;
    }/*else if(n<=3){
        solve(1,1);
        return maxi;
    }*/else{
        int con=0;
        vector<vi> psum;
        psum.assign(n+2,vi(n+2,0));
        for(int i=1;i<=n;i++){
            int j=1;
            for(;j<=n && mat[i][j]==1;j++);
            for(;j<=n && mat[i][j]==0;j++);
            for(;j<=n && mat[i][j]==1;j++);
            if(j<=n){
                xd=false;
            }
        }
        for(int i=1;i<=n;i++){
            int j=1;
            for(;j<=n && mat[j][i]==1;j++);
            for(;j<=n && mat[j][i]==0;j++);
            for(;j<=n && mat[j][i]==1;j++);
            if(j<=n){
                xd=false;
            }
        }
        vector<pair<int,int>> hori(n+2),vert(n+2);
        if(xd){
            for(int i=0;i<=n+1;i++){
                int j=0;
                for(;j<=n+1 && mat[i][j]==1;j++);
                hori[i].first=j-1;
                j=n+1;
                for(;j>=0 && mat[i][j]==1;j--);
                hori[i].second=j+1;
            }
            for(int i=0;i<=n+1;i++){
                int j=0;
                for(;j<=n+1 && mat[j][i]==1;j++);
                vert[i].first=j-1;
                j=n+1;
                for(;j>=0 && mat[j][i]==1;j--);
                vert[i].second=j+1;
            }
            for(int i=1;i<=n+1;i++){
                for(int j=1;j<=n+1;j++){
                    psum[i][j]=psum[i-1][j]+psum[i][j-1]-psum[i-1][j-1]+(mat[i][j]==0?1:0);
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(mat[i][j]==0){
                        con++;
                        //izquierda arriba;
                        //hori[i].first vert[i].first;
                        if(psum[vert[j].first][hori[i].first]>0){
                            xd=false;
                        }
                        //izquierda abajo;
                        if(psum[n][hori[i].first]-psum[vert[j].second-1][hori[i].first]-psum[n][0]+psum[vert[j].second-1][0]>0){
                            xd=false;
                        }
                    }
                }
            }
            if(xd){
                return con;
            }else{
                return 1;
            }
        }else{
            return 1;
        }
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |