제출 #1122099

#제출 시각아이디문제언어결과실행 시간메모리
1122099ihneRigged Roads (NOI19_riggedroads)C++17
19 / 100
256 ms262144 KiB
#include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fi first #define se second #define pb push_back const int mn=3e5+5; int tin[mn],tout[mn],timer; int A[mn],B[mn],ans[mn]; bool ch[mn]; vector<int> lca; pii up[mn]; vector<pii> g[mn]; int st[2*mn][20],pos[2*mn],h[mn],lg[2*mn]; void dfs(int u,int p){ pos[u]=lca.size(); lca.pb(h[u]); tin[u]=++timer; for (pii id:g[u]){ int v; if (id.se) v=B[id.fi]; else v=A[id.fi]; if (v==p) continue; up[v]=id; up[v].se=u; h[v]=h[u]+1; dfs(v,u); lca.pb(h[u]); } tout[u]=timer; } bool is_ancs(int u,int v){ return tin[u]<=tin[v]&&tout[u]>=tout[v]; } int get(int l,int r){ if (l>r) swap(l,r); int k=lg[r-l]; return min(st[k][l],st[k][r-(1<<k)+1]); } signed main(){ //freopen("","r",stdin); //freopen("","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); for (int i=2;i<=6e5;i++) lg[i]=lg[i>>1]+1; int n,e; cin>>n>>e; for (int i=1;i<=e;i++){ int u,v; cin>>u>>v; if (u>v) swap(u,v); A[i]=u; B[i]=v; } for (int i=1;i<n;i++){ int id; cin>>id; ch[id]=1; g[A[id]].pb({id,1}); g[B[id]].pb({id,0}); } lca.pb(0); h[1]=1; dfs(1,1); int N=lca.size()-1; for (int i=1;i<=N;i++) st[0][i]=lca[i]; for (int i=1;i<=19;i++){ for (int j=1;j+(1<<i)-1<=N;j++){ st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]); } } int cur=1; tout[0]=timer; for (int i=1;i<=e;i++){ if (ans[i]) continue; if (ch[i]) { ans[i]=cur++; up[B[i]]=up[A[i]]; } else{ int u=A[i]; int v=B[i]; int dep=get(pos[u],pos[v]); vector<int> edge; if (!is_ancs(u,v)) { while (!is_ancs(up[u].se,v)){ edge.pb(up[u].fi); int nd=up[u].se; up[u]=up[nd]; u=nd; } if (h[up[u].se]==dep){ edge.pb(up[u].fi); int nd=up[u].se; up[u]=up[nd]; u=nd; } } if (!is_ancs(v,u)) { while (!is_ancs(up[v].se,u)){ edge.pb(up[v].fi); int nd=up[v].se; up[v]=up[nd]; v=nd; } if (h[up[v].se]==dep){ edge.pb(up[v].fi); int nd=up[v].se; up[v]=up[nd]; v=nd; } } sort(edge.begin(),edge.end()); for (int id:edge) ans[id]=cur++; ans[i]=cur++; } } for (int i=1;i<=e;i++) cout<<ans[i]<<" "; }
#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...