Submission #1221593

#TimeUsernameProblemLanguageResultExecution timeMemory
1221593thelegendary08축구 경기장 (IOI23_soccer)C++17
35.50 / 100
1172 ms94860 KiB
#include "soccer.h"
#include<bits/stdc++.h>
#define int long long
#define f0r(i,n) for(int i = 0;i<n;i++)
#define FOR(i, k, n) for(int i = k;i<n;i++)
#define pb push_back
#define vi vector<int>
#define pii pair<int,int>
#define mp make_pair
#define vpii vector<pii>
#define vvi vector<vi>
using namespace std;
bool solve(pii a, pii b, vvi &psr, vvi &psc){
	if(a.first == b.first || a.second == b.second){
		return 1;
	}
	
	int s1 = psr[a.first][max(a.second, b.second) + 1] - psr[a.first][min(a.second, b.second)] +
			 psc[b.second][max(a.first, b.first) + 1] - psc[b.second][min(a.first, b.first)];
	int s2 = psc[a.second][max(a.first, b.first) + 1] - psc[a.second][min(a.first, b.first)] + 
			 psr[b.first][max(a.second, b.second) + 1] - psr[b.first][min(a.second, b.second)];
	if(s1 == 0 || s2 == 0)return 1;
	else return 0;
}
signed biggest_stadium(signed n, std::vector<std::vector<signed>> v)
{
	int s = 0;
	pii p = mp(-1,-1);
	f0r(i,n){
		f0r(j,n){
			s += v[i][j];
			if(v[i][j])p = mp(i,j);
		}
	}
	if(s == 0){
		return n * n;
	}
	else if(s == 1){
		int a = min(p.first+1, n-p.first);
		int b = min(p.second+1, n-p.second);
		return n * n - a * b;
	}
	else if(n <= 3){
		int ans = 0; 
		f0r(i, (1LL << (n * n))){
			vector<vector<signed>>V(n, vector<signed>(n));
			int sum = 0;
			bool oke = 1; 
			f0r(j, n * n){
				if((1LL << j) & i){
					V[j/n][j%n] = 1; 
				}
				else{
					V[j/n][j%n] = 0; sum++;
					if(v[j/n][j%n] == 1)oke = 0;
				}
				
			}
			if(oke){
				vector<vector<signed>>v = V;
				bool ok = 1;
				f0r(i,n){
					bool off = 0;
					f0r(j,n){
						if(off){
							if(v[i][j] == 0 && v[i][j-1] == 1){
								ok = 0;
							}
						}
						if(v[i][j] == 0){
							off = 1;
						}
					}
				}
				f0r(j,n){
					bool off = 0;
					f0r(i,n){
						if(off){
							if(v[i][j] == 0 && v[i-1][j] == 1){
								ok = 0;
							}
						}
						if(v[i][j] == 0){
							off = 1;
						}
					}
				}
				
				if(!ok){
					continue;
				}
				else{
					vpii pts;
					vvi psr; //fix i move j 
					vvi psc; //fix j move i
					f0r(i,n){
						vi ps(n+1);
						int la = -1;
						f0r(j,n){
							ps[j+1] = ps[j] + v[i][j];
							if(v[i][j] == 0)la = j;
						}
						int fi = -1;
						f0r(j,n){
							if(v[i][j] == 0){
								fi = j; break;
							}
						}
						if(la != -1){
							pts.pb(mp(i, la));
						}
						if(fi != -1 && fi != la){
							pts.pb(mp(i, fi));
						}
						psr.pb(ps);
					}
					
					f0r(i,n){
						vi ps(n+1);
						int la = -1;
						f0r(j,n){
							ps[j+1] = ps[j] + v[j][i];
							if(v[j][i] == 0)la = j;
						}
						int fi = -1;
						f0r(j,n){
							if(v[j][i] == 0){
								fi = j; break;
							}
						}
						if(la != -1){
							pts.pb(mp(la, i));
						}
						if(fi != -1 && fi != la){
							pts.pb(mp(fi, i));
						}
						psc.pb(ps);
					}
					
					f0r(i,pts.size()){
						f0r(j,pts.size()){
							if(i != j){
								if(!solve(pts[i], pts[j], psr, psc)){
									ok = 0;
								}
							}
						}
					}
					if(ok){
						ans = max(ans, sum);
					}
					
				}
			}
		}
		return ans;
	}
	else{
		bool ok = 1;
		f0r(i,n){
			bool off = 0;
			f0r(j,n){
				if(off){
					if(v[i][j] == 0 && v[i][j-1] == 1){
						ok = 0;
					}
				}
				if(v[i][j] == 0){
					off = 1;
				}
			}
		}
		f0r(j,n){
			bool off = 0;
			f0r(i,n){
				if(off){
					if(v[i][j] == 0 && v[i-1][j] == 1){
						ok = 0;
					}
				}
				if(v[i][j] == 0){
					off = 1;
				}
			}
		}
		
		if(!ok){
			return 0;
		}
		else{
			vpii pts;
			vvi psr; //fix i move j 
			vvi psc; //fix j move i
			f0r(i,n){
				vi ps(n+1);
				int la = -1;
				f0r(j,n){
					ps[j+1] = ps[j] + v[i][j];
					if(v[i][j] == 0)la = j;
				}
				int fi = -1;
				f0r(j,n){
					if(v[i][j] == 0){
						fi = j; break;
					}
				}
				if(la != -1){
					pts.pb(mp(i, la));
				}
				if(fi != -1 && fi != la){
					pts.pb(mp(i, fi));
				}
				psr.pb(ps);
			}
			
			f0r(i,n){
				vi ps(n+1);
				int la = -1;
				f0r(j,n){
					ps[j+1] = ps[j] + v[j][i];
					if(v[j][i] == 0)la = j;
				}
				int fi = -1;
				f0r(j,n){
					if(v[j][i] == 0){
						fi = j; break;
					}
				}
				if(la != -1){
					pts.pb(mp(la, i));
				}
				if(fi != -1 && fi != la){
					pts.pb(mp(fi, i));
				}
				psc.pb(ps);
			}
			
			f0r(i,pts.size()){
				f0r(j,pts.size()){
					if(i != j){
						if(!solve(pts[i], pts[j], psr, psc)){
							ok = 0;
						}
					}
				}
			}
			if(ok)return n*n-s;
			else return 0;
			
		}
	}
    return 0;
}
#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...