제출 #915908

#제출 시각아이디문제언어결과실행 시간메모리
915908biank축구 경기장 (IOI23_soccer)C++17
48 / 100
4689 ms1960200 KiB
#include <bits/stdc++.h> using namespace std; #define ALL(x) x.begin(),x.end() #define SIZE(x) (int)x.size() #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define forn(i,n) for(int i=0;i<int(n);i++) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define fst first #define snd second typedef long long ll; typedef pair<int,int> ii; const int MAXN = 500; int f[MAXN][MAXN]; pair<ll,ii> dp[MAXN][MAXN][MAXN]; int n; int left(int i, int p) { dforn(j,p+1) if(f[i][j]==1) return j; return -1; } int right(int i, int p) { forsn(j,p,n) if(f[i][j]==1) return j; return n; } pair<ll,ii> solve(int l, int r, int p) { if(l>r) return {0LL,{-1,n}}; if(dp[l][r][p].fst!=-1) return dp[l][r][p]; auto calculate = [&](pair<int,ii> prev, int i) { auto [val,range] = prev; int mini = max(range.fst, left(i,p)), maxi = min(range.snd, right(i,p)); return (pair<ll,ii>){val+max(maxi-mini-1,0),{mini,maxi}}; }; return dp[l][r][p] = max(calculate(solve(l+1,r,p),l), calculate(solve(l,r-1,p),r)); } int biggest_stadium(int N, vector<vector<int>> F) { n=N; forn(i,n) forn(j,n) { f[i][j]=F[i][j]; } forn(i,n) forn(j,n) forn(k,n) { dp[i][j][k].fst = -1; } ll ans = 0LL; forn(i,n) { ll curr = solve(0,n-1,i).fst; ans=max(ans,curr); } return int(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...