Submission #591987

#TimeUsernameProblemLanguageResultExecution timeMemory
591987andrei_boacaPipes (CEOI15_pipes)C++14
50 / 100
4781 ms32736 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]; set<pii> used; vector<pii> edges; 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]; } assert(par[a]==par[b]&&a!=b); return par[a]; } void dfscalc(int nod) { for(int i:muchii[nod]) 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]); bool ok=0; if(a==1&&b==8) ok=1; used.insert({a,b}); } 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 i:muchii[nod]) 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); edges.push_back({min(a,b),max(a,b)}); } else { int lca=LCA(a,b); val[a]++; val[b]++; val[lca]-=2; } } assert(cnt<=n-1); for(int i=1;i<=n;i++) if(lg[i]) dfscalc(myroot[i]); for(auto i:edges) if(used.find(i)==used.end()) cout<<i.first<<' '<<i.second<<'\n'; return 0; }

Compilation message (stderr)

pipes.cpp: In function 'void dfscalc(int)':
pipes.cpp:43:14: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
   43 |         bool ok=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...