Submission #1206552

#TimeUsernameProblemLanguageResultExecution timeMemory
1206552hyakupSoccer Stadium (IOI23_soccer)C++20
54 / 100
226 ms31900 KiB
#include "soccer.h" #include <bits/stdc++.h> using namespace std; int check_all( vector<vector<int>> &mat ){ int n = mat.size(); vector<int> l(n, n), r(n, -1); int tot = 0; for( int i = 0; i < n; i++ ) for( int j = 0; j < n; j++ ) if( mat[i][j] == 0 ){ tot++; l[i] = min( l[i], j ); r[i] = max( r[i], j ); } return tot; auto contains = [&]( int a, int b ){ return l[a] <= l[b] && r[b] <= r[a]; }; int cont = 0; for( int i = 0; i < n; i++ ) if( l[i] != n ){ cont += (r[i] - l[i] + 1); for( int j = i + 1; j < n; j++ ) if( l[j] != n && !contains( i, j ) && !contains( j, i ) ) return 0; } if( tot < cont ) return 0; fill( l.begin(), l.end(), n ); fill( r.begin(), r.end(), -1 ); for( int i = 0; i < n; i++ ) for( int j = 0; j < n; j++ ) if( mat[j][i] == 0 ){ l[i] = min( l[i], j ); r[i] = max( r[i], j ); } cont = 0; for( int i = 0; i < n; i++ ) if( l[i] != n ){ cont += (r[i] - l[i] + 1); for( int j = i + 1; j < n; j++ ) if( l[j] != n && !contains( i, j ) && !contains( j, i ) ) return 0; } if( tot < cont ) return 0; return tot; } const int maxn = 50; const int inf = 1e5; int dp[maxn][maxn][maxn][maxn]; int sum[maxn][maxn]; int n; int query( int l, int r, int u, int d ){ return sum[d][r] - sum[d][l - 1] - sum[u - 1][r] + sum[u - 1][l - 1]; } int solve( int l, int r, int u, int d ){ if( l < 0 || r >= n || u < 0 || d >= n ) return -inf; if( u > d ) return 0; if( query( l + 1, r + 1, u + 1, d + 1 ) ) return -inf; if( dp[l][r][u][d] != -1 ) return dp[l][r][u][d]; dp[l][r][u][d] = max({ solve( l - 1, r, u, d ) + (d - u + 1), solve( l, r + 1, u, d ) + (d - u + 1), solve( l, r, u + 1, d ), solve( l, r, u, d - 1 ) }); return dp[l][r][u][d]; } int solve1( vector<vector<int>> &mat ){ int n = mat.size(); int a, b; for( int i = 0; i < n; i++ ) for(int j = 0; j < n; j++ ) if( mat[i][j] == 1 ) a = i, b = j; return n*n - min( a + 1, n - a )*min( b + 1, n - b ); } int biggest_stadium(int N, vector<vector<int>> mat ){ int total = check_all(mat); if( total + 1 == N*N ) return solve1(mat); n = N; for( int i = 0; i < n; i++ ) for( int j = 0; j < n; j++ ) for( int k = 0; k < n; k++ ) for( int l = 0; l < n; l++ ) dp[i][j][k][l] = -1; for( int i = 1; i <= n; i++ ) for( int j = 1; j <= n; j++ ) sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + mat[i - 1][j - 1]; int resp = 0; vector<int> h(n); for( int i = 0; i < n; i++ ){ for( int j = 0; j < n; j++ ){ if( mat[i][j] == 0 ) h[j]++; else h[j] = 0; resp = max( resp, solve( j, j, i - h[j] + 1, i ) + h[j] ); } } return resp; }
#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...