제출 #930075

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