제출 #930022

#제출 시각아이디문제언어결과실행 시간메모리
930022abcvuitunggio축구 경기장 (IOI23_soccer)C++17
0 / 100
38 ms155436 KiB
#include "soccer.h" #include <bits/stdc++.h> using namespace std; const int mxn=2006; int n,res,dp[mxn][mxn],l[mxn][mxn],r[mxn][mxn],u[mxn][mxn],d[mxn][mxn],ch[mxn][mxn],a[mxn][mxn],b[mxn][mxn]; vector <int> ve[mxn][mxn]; int f(int i, int j){ if (dp[i][j]!=-1) return dp[i][j]; if (j!=l[i][j]) return dp[i][j]=f(i,l[i][j]); dp[i][j]=0; int sz=r[i][j]-l[i][j]+1; for (int k:ve[i][j]) dp[i][j]=max(dp[i][j],f(k,j)-sz*(d[k][j]-u[k][j]+1)); dp[i][j]+=sz*(d[i][j]-u[i][j]+1); return dp[i][j]; } int solve(vector <vector <int>> F){ for (int i=0;i<n;i++){ for (int j=0;j<n;j++){ l[i][j]=(j&&!F[i][j-1]?l[i][j-1]:j); u[i][j]=0; d[i][j]=n-1; } for (int j=n;j;j--) r[i][j-1]=(j<n&&!F[i][j]?r[i][j]:j-1); } memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); for (int j=0;j<n;j++){ stack <int> st; for (int i=0;i<n;i++){ if (F[i][j]){ while (!st.empty()){ d[st.top()][j]=i-1; st.pop(); } continue; } while (!st.empty()&&(l[i][j]>l[st.top()][j]||r[i][j]<r[st.top()][j])){ d[st.top()][j]=i-1; st.pop(); } if (!st.empty()){ if (r[i][j]-l[i][j]==r[st.top()][j]-l[st.top()][j]){ a[i][j]=st.top(); continue; } ve[st.top()][j].push_back(i); } ch[i][j]=1; st.push(i); } while (!st.empty()) st.pop(); for (int i=n-1;i>=0;i--){ if (F[i][j]){ while (!st.empty()){ u[st.top()][j]=i+1; st.pop(); } continue; } while (!st.empty()&&(l[i][j]>l[st.top()][j]||r[i][j]<r[st.top()][j])){ u[st.top()][j]=i+1; st.pop(); } if (!st.empty()){ if (r[i][j]-l[i][j]==r[st.top()][j]-l[st.top()][j]){ b[i][j]=st.top(); continue; } ve[st.top()][j].push_back(i); } ch[i][j]=1; st.push(i); } } for (int i=0;i<n;i++) for (int j=0;j<n;j++){ if (a[i][j]>=0) d[i][j]=d[a[i][j]][j]; if (b[i][j]>=0) u[i][j]=u[b[i][j]][j]; } memset(dp,-1,sizeof(dp)); int ans=0; for (int i=0;i<n;i++) for (int j=0;j<n;j++) if (ch[i][j]) ans=max(ans,f(i,j)); return ans; } int biggest_stadium(int N, vector <vector <int>> F){ n=N; res=solve(F); for (int i=0;i<n;i++) for (int j=i;j<n;j++) swap(F[i][j],F[j][i]); return max(res,solve(F)); }
#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...