Submission #591996

#TimeUsernameProblemLanguageResultExecution timeMemory
591996andrei_boacaPipes (CEOI15_pipes)C++14
100 / 100
4823 ms15272 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; vector<vector<int>> muchii; int comp[100005],myroot[100005],dp[19][100005],val[100005],par[100005],niv[100005],lg[100005]; int n,m; int what; int LCA(int a,int b) { if(niv[a]<niv[b]) swap(a,b); int dif=niv[a]-niv[b]; for(int i=0;i<=17;i++) if((dif>>i)&1) a=dp[i][a]; if(a==b) return a; for(int i=17;i>=0;i--) if(dp[i][a]!=0&&dp[i][b]!=0) if(dp[i][a]!=dp[i][b]) { a=dp[i][a]; b=dp[i][b]; } return par[a]; } void dfscalc(int nod) { for(int q:muchii[nod]) { int i=abs(q); if(i!=par[nod]) { dfscalc(i); val[nod]+=val[i]; } } if(val[nod]) { int a=min(nod,par[nod]); int b=max(nod,par[nod]); for(int &i:muchii[a]) if(i==b&&i>0) { i=-i; break; } } comp[nod]=what; } void dfsbuild(int nod) { val[nod]=0; dp[0][nod]=par[nod]; for(int i=1;i<=17;i++) dp[i][nod]=dp[i-1][dp[i-1][nod]]; for(int q:muchii[nod]) { int i=abs(q); if(i!=par[nod]) { par[i]=nod; niv[i]=niv[nod]+1; dfsbuild(i); } } } void dsumerge(int a, int b) { int c1=comp[a],c2=comp[b]; if(lg[c1]<lg[c2]) { swap(a,b); swap(c1,c2); } what=c1; dfscalc(myroot[c2]); par[b]=a; lg[c1]+=lg[c2]; lg[c2]=0; niv[b]=niv[a]+1; muchii[a].push_back(b); muchii[b].push_back(a); dfsbuild(b); } int main() { cin>>n>>m; muchii.resize(n+1); for(int i=1;i<=n;i++) { niv[i]=1; lg[i]=1; comp[i]=i; myroot[i]=i; par[i]=0; val[i]=0; } int cnt=0; for(int z=1;z<=m;z++) { int a,b; cin>>a>>b; if(comp[a]!=comp[b]) { cnt++; dsumerge(a,b); } else { int lca=LCA(a,b); val[a]++; val[b]++; val[lca]-=2; } } for(int i=1;i<=n;i++) if(lg[i]) dfscalc(myroot[i]); for(int i=1;i<=n;i++) for(int j:muchii[i]) if(j>i&&j>0) cout<<i<<' '<<j<<'\n'; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...