Submission #1193126

#TimeUsernameProblemLanguageResultExecution timeMemory
1193126loomRigged Roads (NOI19_riggedroads)C++20
100 / 100
196 ms57840 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define nl '\n'

vector<pair<int,int>> g[300001];
int par[300001];
int id[300001];
int d[300001];
int p[300001];
vector<int> ids;

void dfs(int v){
	for(auto [ch, i] : g[v]){
		if(ch == par[v]) continue;

		d[ch] = d[v]+1;
		id[ch] = i;
		par[ch] = v;
		dfs(ch);
	}
}

int find(int x){
	return (x == p[x] ? x : (p[x] = find(p[x])));
}

int unite(int x, int y, int i){
	x = find(x);
	if(x == y) return x;

	ids.push_back(i);
	p[y] = x;
	return x;
}

inline void solve(){
	int n, m;
	cin>>n>>m;
	vector<tuple<int,int,int>> e;
	for(int i=0; i<m; i++){
		int u, v;
		cin>>u>>v;
		e.push_back({u, v, i});
	}

	vector<int> r(m, 0);
	for(int i=0; i<n-1; i++){
		int x;
		cin>>x;
		r[--x] = 1;
	}

	int x;
	for(auto [u, v, i] : e){
		if(r[i]){
			g[u].push_back({v, i});
			g[v].push_back({u, i});
			x = u;
		}
	}

	dfs(x);
	for(int i=1; i<=n; i++) p[i] = i;
	vector<int> ans(m, -1);
	int cnt = 0;

	for(auto [u, v, i] : e){
		if(r[i]){
			if(ans[i] == -1){
				ans[i] = ++cnt;

				if(d[u] < d[v]) swap(u, v);
				unite(par[u], u, 0);
				ids.clear();
			}
			continue;
		}

		u = find(u);
		v = find(v);
		while(u != v){
			if(d[u] < d[v]) swap(u, v);
			u = unite(par[u], u, id[u]);
		}

		sort(ids.begin(), ids.end());
		for(int x : ids) ans[x] = ++cnt;
		ans[i] = ++cnt;
		ids.clear();
	}

	for(int i=0; i<m; i++) cout<<ans[i]<<" ";
}

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(NULL);cout.tie(NULL);

	int t = 1;
	//cin>>t;
	while(t--) solve();

	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...