Submission #676485

#TimeUsernameProblemLanguageResultExecution timeMemory
676485penguin133Rigged Roads (NOI19_riggedroads)C++17
100 / 100
370 ms48824 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pi pair<int, int>
#define pii pair<int, pair<int, int> > 
#define fi first
#define se second
int n,m;
int A[300005], B[300005];
int par[300005];
pi P[300005];
vector<int>tmp;
vector<pi>v[300005];
int dep[300005];
int cnt = 1;

int getr(int x){
	return (par[x] == x ? x : par[x] = getr(par[x]));
}

void merge(int a, int b){
	a = getr(a), b = getr(b);
	if(dep[a] > dep[b])swap(a, b);
	if(a != b)par[b] = a;
}
bool vis[500005];
int mrk[500005];
void solve(){
	cin >> n >> m;
	for(int i=1;i<=m;i++)cin >> A[i] >> B[i];
	
	for(int i=1;i<n;i++){
		int x;cin >> x;
		vis[x] = 1;
		v[A[x]].push_back({B[x], x});
		v[B[x]].push_back({A[x], x});
	}
	queue<pi>q;
	q.push({1, -1});
	while(!q.empty()){
		pi x = q.front(); q.pop();
		if(x.se == -1)dep[x.fi] = 1;
		if(x.se != -1)P[x.fi] = {(A[x.se] == x.fi ? B[x.se] : A[x.se]),x.se};
		for(auto [i, j] : v[x.fi])if(!dep[i])q.push({i, j}), dep[i] = dep[x.fi] + 1;
	}
	//for(int i=1;i<=n;i++)cout << P[i].fi << " " << P[i].se << '\n';
	set<int>s;
	for(int i=1;i<=n;i++)par[i] = i;
	for(int i=1;i<=m;i++){
		if(mrk[i])continue;
		if(vis[i])mrk[i] = cnt++, merge(A[i], B[i]);
		else{
			tmp.clear();
			int a = A[i], b = B[i];
			a = getr(a), b = getr(b);
			while(a != b){
				if(dep[a] > dep[b]){
					tmp.push_back(P[a].se);
					merge(P[a].fi, a);
					a = getr(a);
				}
				else{
					tmp.push_back(P[b].se);
					merge(P[b].fi, b);
					b = getr(b);
				}
			}
			sort(tmp.begin(), tmp.end());
			for(auto j : tmp)if(!mrk[j])mrk[j] = cnt++;
			mrk[i] = cnt++;
		}
	}
	for(int i=1;i<=m;i++)cout << mrk[i] << " ";
}
 
main(){
	ios::sync_with_stdio(0);cin.tie(0);
	int t = 1;
	//cin >> t;
	while(t--){
		solve();
	}
}

Compilation message (stderr)

riggedroads.cpp:76:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   76 | main(){
      | ^~~~
#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...