Submission #994683

#TimeUsernameProblemLanguageResultExecution timeMemory
994683vjudge1Pipes (CEOI15_pipes)C++17
90 / 100
1883 ms65536 KiB
#include<bits/stdc++.h> using namespace std; #define N 100100 #define C cyc.abp struct unionf{ int par[N]; unionf(){ for(int i=0;i<N;i++) par[i]=i; } int abp(int a){ return (par[a]-a?par[a]=abp(par[a]):a); } } cyc,comp; int par[N],sz[N],dep[N],ee; set<pair<int,int>>st; vector<pair<int,int>>adj[N]; int depth=0,times=0; void repos(int x,int p,int d){ par[x]=p,dep[x]=d; for(auto[i,j]:adj[x]) if(C(i)-p&&C(i)!=x) repos(C(i),x,d+1); depth--; } int mergepar(int a){ times++; if(times>N){ cout<<"fail (infinite loop)"; exit(0); } int b=par[a]; dep[a]=dep[b]; par[a]=par[b]; if(adj[a].size()<adj[b].size()) swap(a,b); cyc.par[b]=a; for(auto[i,j]:adj[b]) if(C(i)-a&&C(i)-b){ adj[a].push_back({i,j}); if(C(i)-par[a]) par[C(i)]=a; ee++; } ee-=adj[b].size(); adj[b].clear(); return a; } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) sz[i]=1; while(m--){ if(ee>=2*n){ cout<<"fail (merged too many times)"; exit(0); } int a,b; cin>>a>>b; if(C(a)==C(b)) continue; if(a==7&&b==5){ cerr<<"stuff"; } if(comp.abp(a)==comp.abp(b)){ int acyc=C(a),bcyc=C(b); while(acyc-bcyc){ if(dep[acyc]<dep[bcyc]) swap(acyc,bcyc); acyc=mergepar(acyc), bcyc=C(bcyc); } } else { int acyc=C(a),bcyc=C(b); int acomp=comp.abp(a),bcomp=comp.abp(b); if(sz[acomp]<sz[bcomp]) swap(a,b), swap(acyc,bcyc),swap(acomp,bcomp); sz[acomp]+=sz[bcomp]; comp.par[bcomp]=acomp; repos(bcyc,acyc,dep[acyc]+1); adj[acyc].push_back({b,a}); adj[bcyc].push_back({a,b}); ee+=2; } } for(int i=1;i<=n;i++)if(C(i)==i) for(auto[j,k]:adj[i]) if(C(j)-i) st.insert({min(j,k),max(j,k)}); for(auto[i,j]:st) cout<<i<<' '<<j<<'\n'; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...