Submission #1079612

#TimeUsernameProblemLanguageResultExecution timeMemory
1079612alontanaySoccer Stadium (IOI23_soccer)C++17
77.50 / 100
293 ms39764 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 2005; int U[MAX_N][MAX_N]; int D[MAX_N][MAX_N]; int segUmin[MAX_N][MAX_N]; int segDmin[MAX_N][MAX_N]; int dp[MAX_N][MAX_N]; int biggest_stadium(int N, std::vector<std::vector<int>> F) { int cnt = 0; for(vector<int> &row : F) { for(int cell : row) { cnt += cell; } } if(cnt == 0) { return N*N; } else if(cnt == 1) { for(int r = 0; r < N; r ++) { for(int c = 0; c < N; c ++) { if(F[r][c]) { r = min(r+1,N-r); c = min(c+1,N-c); return N*N-r*c; } } } } if(N > 500) { for(int r = 0; r < N; r ++) { int lst = 1; int switches = 0; for(int c = 0; c < N; c ++) { switches += lst^F[r][c]; lst = F[r][c]; } switches += lst^1; if(switches > 2) { return MAX_N*MAX_N; } } for(int c = 0; c < N; c ++) { int lst = 1; int switches = 0; for(int r = 0; r < N; r ++) { switches += lst^F[r][c]; lst = F[r][c]; } switches += lst^1; if(switches > 2) { return MAX_N*MAX_N; } } vector<pair<int,int>> segs; for(int r = 0; r < N; r ++) { int st = N, en = 0; for(int c = 0; c < N; c ++) { if(!F[r][c]) { st = min(st,c); en = max(en,c); } } if(st <= en) { segs.push_back({st,-en}); } } sort(segs.begin(),segs.end()); for(int i = 0; i < (int)(segs.size())-1; i ++) { if(segs[i].second > segs[i+1].second) { return MAX_N*MAX_N; } } return N*N-cnt; } for(int c = 0; c < N; c ++) { int lst = -1; for(int r = 0; r < N; r ++) { if(F[r][c]) { lst = r; } U[r][c] = r-lst; } lst = N; for(int r = N-1; r >= 0; r--) { D[r][c] = lst-r-1; if(F[r][c]) { lst = r; } } } int res = 0; for(int r = 0; r < N; r ++) { for(int i = 0; i < N; i ++) { segUmin[i][i] = MAX_N;; for(int j = i + 1; j <= N; j ++) { segUmin[i][j] = min(segUmin[i][j-1],U[r][j-1]); } segDmin[i][i] = MAX_N; for(int j = i + 1; j <= N; j ++) { segDmin[i][j] = min(segDmin[i][j-1],D[r][j-1]); } } for(int sz = 1; sz <= N; sz ++) { for(int r = sz; r <= N; r ++) { int l = r-sz; int cur_h = segUmin[l][r] + segDmin[l][r]; dp[l][r] = max(dp[l][r-1],dp[l+1][r]) + cur_h; } } res = max(res,dp[0][N]); } 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...