제출 #842739

#제출 시각아이디문제언어결과실행 시간메모리
842739errorgorn축구 경기장 (IOI23_soccer)C++17
64 / 100
4576 ms95776 KiB
#include "soccer.h" #include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> #define iii pair<ii,int> #define fi first #define se second #define endl '\n' #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front #define lb lower_bound #define ub upper_bound #define rep(x,start,end) for(int x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--)) #define all(x) (x).begin(),(x).end() #define sz(x) (int)(x).size() mt19937 rng(chrono::system_clock::now().time_since_epoch().count()); int n; int arr[2005][2005]; vector<ii> V; vector<ii> L[2005],R[2005]; int memo[2005][2005]; void dfs(int x,vector<ii> v,int d){ if (x==-1 || x==n) return; vector<ii> res; for (auto [l,r]:v){ rep(y,l,r+1) if (arr[x][y]==0){ if (!res.empty() && res.back().se+1==y) res.back().se++; else res.pub({y,y}); } } for (auto it:res) V.pub(it); dfs(x+d,res,d); } signed biggest_stadium(signed N, std::vector<std::vector<signed>> F){ n=N; rep(x,0,n) rep(y,0,n) arr[x][y]=F[x][y]; int ans=0; rep(x,0,n){ vector<ii> v; rep(y,0,n) if (arr[x][y]==0){ if (!v.empty() && v.back().se+1==y) v.back().se++; else v.pub({y,y}); } V=v; dfs(x-1,v,-1); dfs(x+1,v,1); sort(all(V),[](ii i,ii j){ if ((i.se-i.fi)==(j.se-j.fi)) return i>j; else return i.se-i.fi<j.se-j.fi; }); vector<iii> res; for (auto it:V){ if (!res.empty() && res.back().fi==it) res.back().se++; else res.pub({it,1}); } //for (auto it:res) cout<<it.fi.fi<<" "<<it.fi.se<<" "<<it.se<<endl; //cout<<endl; rep(x,0,n) L[x].clear(),R[x].clear(); for (auto it:res){ L[it.fi.fi].pub({it.fi.se,it.se}); R[it.fi.se].pub({it.fi.fi,it.se}); } rep(x,0,n+1) rep(y,x,n+1) memo[x][y]=0; rep(l,0,n+1) rep(x,0,n-l+1){ int y=x+l; if (x!=0){ int t=memo[x][y]; for (auto it:L[x]) if (y<=it.fi) t+=(min(it.fi,y)-x+1)*it.se; memo[x-1][y]=max(memo[x-1][y],t); } if (y!=n){ int t=memo[x][y]; for (auto it:R[y]) if (it.fi<=x) t+=(y-max(it.fi,x)+1)*it.se; memo[x][y+1]=max(memo[x][y+1],t); } } ans=max(ans,memo[0][n]); //rep(x,0,n+1){ //rep(y,0,n+1) cout<<memo[x][y]<<" "; cout<<endl; //} //cout<<endl; } 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...