Submission #1122099

#TimeUsernameProblemLanguageResultExecution timeMemory
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...