Submission #1092340

#TimeUsernameProblemLanguageResultExecution timeMemory
1092340TlenekWodoruFountain Parks (IOI21_parks)C++17
5 / 100
3577 ms126076 KiB
#include<bits/stdc++.h> #include "parks.h" using namespace std; struct Edge { int som,ind; }; map<pair<int,int>,int>M,M2; vector<Edge>Graf[200009]; vector<int>D[1000009]; pair<int,int>KimJest[1000009]; bool zaj[1000009]; vector<int>Sprz; int g[1000009]; int match[1000009]; int n,m=0,k=0,N,IleVert=0; int f[200009],ilosc[200009]; int odl[1000009]; int F(int v) { if(f[v]==v){return v;} return f[v]=F(f[v]); } void Polacz(int a, int b) { a=F(a); b=F(b); if(a==b){return;} if(ilosc[a]<ilosc[b]){swap(a,b);} ilosc[a]+=ilosc[b]; f[b]=a; } bool DFS(int v) { if(v==N) { return 1; } for(int som : D[v]) { if(odl[match[som]]==odl[v]+1&&DFS(match[som])) { match[v]=som; match[som]=v; return 1; } } odl[v]=INT_MAX; return 0; } bool BFS() { queue<int>Q; for(int i=0;i<N;i++) { if(match[i]==N) { odl[i]=N; Q.push(i); } else { odl[i]=INT_MAX; } } odl[N]=INT_MAX; while((int)Q.size()>0) { const int v=Q.front(); Q.pop(); for(int i=0;i<(int)D[v].size();i++) { const int somsiad=D[v][i]; if(odl[match[somsiad]]==INT_MAX) { odl[match[somsiad]]=odl[v]+1; Q.push(match[somsiad]); } } } return (odl[N]!=INT_MAX); } void SKOJ() { random_shuffle(g,g+N); for(int i=0;i<N;i++) { match[i]=N; } while(BFS()==1) { for(int i=0;i<N;i++) { int u=g[i]; if(match[u]==N) { DFS(u); } } } } void Upgrade(int v) { zaj[v]=1; Sprz.push_back(v); for(int som : D[v]) { if(zaj[match[som]]==0) { Upgrade(match[som]); match[v]=som; match[som]=v; return; } else if(match[som]!=v) { break; } } zaj[v]=1; for(int u : Sprz){zaj[u]=0;} Sprz.clear(); match[v]=-1; } void CzySpojna(int v) { zaj[v]=1; IleVert++; for(auto[som,ind] : Graf[v]) { if(zaj[som]){continue;} CzySpojna(som); } } int construct_roads(vector<int>X, vector<int>Y) { srand(21377); n=(int)X.size(); for(int i=0;i<n;i++) { M[{X[i],Y[i]}]=i; } for(int i=0;i<n;i++) { if(M.find({X[i]-2,Y[i]})!=M.end()) { Graf[i].push_back({M[{X[i]-2,Y[i]}],m}); Graf[M[{X[i]-2,Y[i]}]].push_back({i,m}); m++; } if(M.find({X[i],Y[i]-2})!=M.end()) { Graf[i].push_back({M[{X[i],Y[i]-2}],m}); Graf[M[{X[i],Y[i]-2}]].push_back({i,m}); m++; } } CzySpojna(0); if(IleVert!=n){return 0;} vector<pair<int,int>>E(m); for(int i=0;i<n;i++) { for(auto[som,ind] : Graf[i]) { int a=i,b=som; if(pair<int,int>{X[a],Y[a]}>pair<int,int>{X[b],Y[b]}){continue;} E[ind]={a,b}; } } for(int i=0;i<(int)E.size();i++) { const int a=E[i].first,b=E[i].second; vector<pair<int,int>>Som; if(Y[a]+2==Y[b]) { Som.push_back({X[a]-1,Y[a]+1}); Som.push_back({X[a]+1,Y[a]+1}); } else if(X[a]+2==X[b]) { Som.push_back({X[a]+1,Y[a]+1}); Som.push_back({X[a]+1,Y[a]-1}); } for(pair<int,int>som : Som) { if(M2.find(som)==M2.end()) { KimJest[k]=som; M2[som]=k++; } int u=m+M2[som]; D[i].push_back(u); D[u].push_back(i); } } N=m+k; for(int i=0;i<N;i++) { g[i]=i; zaj[i]=0; } SKOJ(); for(int I=1;I<=10;I++) { for(int i=0;i<n;i++) { f[i]=i; ilosc[i]=1; } for(int i=0;i<n;i++) { for(auto[som,ind] : Graf[i]) { if(match[ind]==-1){continue;} Polacz(i,som); } } if(ilosc[F(0)]==n) { vector<int>O1,O2,O3,O4; for(int j=0;j<m;j++) { const int a=E[j].first,b=E[j].second; if(match[j]!=N) { pair<int,int>xd=KimJest[match[j]-m]; O1.push_back(a); O2.push_back(b); O3.push_back(xd.first); O4.push_back(xd.second); } } build(O1,O2,O3,O4); return 1; } vector<int>U; for(int i=0;i<n;i++){g[i]=i;} random_shuffle(g,g+n); for(int i=0;i<n;i++) { const int u=g[i]; for(auto[som,ind] : Graf[u]) { if(match[ind]==N&&F(u)!=F(som)) { U.push_back(ind); Polacz(u,som); } } } for(int u : U) { if(match[u]!=N){continue;} Upgrade(u); } } return 0; }
#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...