Submission #1122206

#TimeUsernameProblemLanguageResultExecution timeMemory
1122206AvianshRigged Roads (NOI19_riggedroads)C++17
10 / 100
215 ms43684 KiB
#include <bits/stdc++.h> using namespace std; struct dsu{ vector<int>root; vector<int>siz; dsu(int n){ root=vector<int>(n); iota(root.begin(),root.end(),0); siz=vector<int>(n,1); } bool unite(int x, int y){ x=findRoot(x); y=findRoot(y); if(x==y) return 0; if(siz[x]<siz[y]) swap(x,y); siz[x]+=siz[y]; root[y]=x; } int findRoot(int x){ if(x==root[x]){ return x; } return root[x]=findRoot(root[x]); } }; void dfs(int st, vector<pair<int,int>>(&g)[], int p, int pare[],int par[], int d[],int dep){ par[st]=p; d[st]=dep; for(pair<int,int>ch:g[st]){ if(ch.first==p) continue; pare[ch.first]=ch.second; dfs(ch.first,g,st,pare,par,d,dep+1); } } signed main(){ ios::sync_with_stdio(0); cin.tie(0); int n,m; cin >> n >> m; dsu ds(n); array<int,2> edges[m]; for(int i = 0;i<m;i++){ int a,b; cin >> a >> b; a--;b--; edges[i][0]=a; edges[i][1]=b; } int r[n-1]; vector<pair<int,int>>g[n]; for(int &i : r){ cin >> i; i--; int a,b; a=edges[i][0]; b=edges[i][1]; g[a].push_back({b,i}); g[b].push_back({a,i}); } sort(r,r+n-1); int pare[n]; int par[n]; int d[n]; par[0]=-1; pare[0]=-1; dfs(0,g,-1,pare,par,d,0); int w[n]; int currw = 1; bool vis[m]; fill(vis,vis+m,0); int ind = 0; for(int i = 0;i<m;i++){ if(vis[i]) continue; vis[i]=1; if(ind<n-1&&i==r[ind]){ w[i]=currw; currw++; ind++; continue; } int a = edges[i][0]; int b = edges[i][1]; vector<int>es; if(d[a]<d[b]){ swap(a,b); } while(pare[a]!=-1&&!vis[pare[a]]&&d[a]>d[b]){ vis[pare[a]]=1; es.push_back(pare[a]); if(a==edges[pare[a]][0]){ a=edges[pare[a]][1]; } else{ a=edges[pare[a]][0]; } } while(((pare[a]!=-1&&!vis[pare[a]])||(pare[b]!=-1&&!vis[pare[b]]))){ if(a==b){ break; } if(pare[a]!=-1&&!vis[pare[a]]){ vis[pare[a]]=1; es.push_back(pare[a]); if(a==edges[pare[a]][0]){ a=edges[pare[a]][1]; } else{ a=edges[pare[a]][0]; } } if(pare[b]!=-1&&!vis[pare[b]]){ vis[pare[b]]=1; es.push_back(pare[b]); if(b==edges[pare[b]][0]){ b=edges[pare[b]][1]; } else{ b=edges[pare[b]][0]; } } } sort(es.begin(),es.end()); for(int i : es){ w[i]=currw; currw++; } w[i]=currw; currw++; } for(int i =0;i<m;i++){ cout << w[i] << " "; } 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...