Submission #1233569

#TimeUsernameProblemLanguageResultExecution timeMemory
1233569AMnuSoccer Stadium (IOI23_soccer)C++20
100 / 100
1601 ms147036 KiB
#include "soccer.h" #include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN = 2e3+5; int N, ans; int A[MAXN][MAXN], P[MAXN][MAXN]; map <ll,int> D; bool exist(int xa,int xb,int ya,int yb) { return P[xb][yb] - P[xb][ya-1] - P[xa-1][yb] + P[xa-1][ya-1]; } int enlarge(int x,int ya,int yb); int solve(int xa,int xb,int ya,int yb) { ll S = (ll)xa<<33|(ll)xb<<22|(ll)ya<<11|(ll)yb; if (D.count(S)) return D[S]; int res = 0; if (xa > 1) { for (int i=yb;i>=ya;i=A[xa-1][i]-1) { if (A[xa-1][i] == i) continue; int j = max(ya,A[xa-1][i]+1); res = max(res, enlarge(xa,j,i) - (xb-xa+1)*(i-j+1)); } } if (xb < N) { for (int i=yb;i>=ya;i=A[xb+1][i]-1) { if (A[xb+1][i] == i) continue; int j = max(ya,A[xb+1][i]+1); res = max(res, enlarge(xa,j,i) - (xb-xa+1)*(i-j+1)); } } return D[S] = res; } int enlarge(int x,int ya,int yb) { int xa=x, xb=x; int l=1, r=x-1; while (l<=r) { int mid = (l+r)/2; if (exist(mid,x,ya,yb)) { l = mid+1; } else { xa = mid; r = mid-1; } } l=x+1, r=N; while (l<=r) { int mid = (l+r)/2; if (exist(x,mid,ya,yb)) { r = mid-1; } else { xb = mid; l = mid+1; } } return solve(xa,xb,ya,yb) + (xb-xa+1)*(yb-ya+1); } int biggest_stadium(int n, vector<vector<int>> F) { N = n; for (int i=1;i<=N;i++) { for (int j=1;j<=N;j++) { P[i][j] = P[i-1][j]+P[i][j-1]-P[i-1][j-1]+F[i-1][j-1]; if (F[i-1][j-1]) { A[i][j] = j; } else { A[i][j] = A[i][j-1]; } } } for (int i=1;i<=N;i++) { for (int j=N;j>0;j=A[i][j]-1) { if (A[i][j] == j) continue; ans = max(ans,enlarge(i,A[i][j]+1,j)); } } return ans; }
#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...