Submission #1252131

#TimeUsernameProblemLanguageResultExecution timeMemory
1252131pinbuRigged Roads (NOI19_riggedroads)C++20
100 / 100
245 ms58508 KiB
#include <bits/stdc++.h>
using namespace std;

const int NM = 300005;

int n, m; array<int, 2> e[NM]; bool s[NM];

vector<array<int, 2>> adj[NM];
int id[NM];
int h[NM], up[NM][19];
void DFS(int u, int p) {
	for (auto [v, i]: adj[u]) if (v ^ p) {
		h[v] = h[u] + 1;
		id[v] = i;
		up[v][0] = u;
		for (int k = 1; k < 19; k++) up[v][k] = up[up[v][k - 1]][k - 1];
		DFS(v, u);
	}
}
int LCA(int u, int v) {
	if (h[u] < h[v]) swap(u, v);
	while (h[u] > h[v]) {
		int k = __builtin_ctz(h[u] - h[v]);
		u = up[u][k];
	}
	if (u == v) return u;
	for (int k = 18; k >= 0; k--) if (up[u][k] ^ up[v][k]) {
		u = up[u][k], v = up[v][k];
	}
	return up[u][0];
}

int par[NM];
int findp(int u) {
	return u ^ par[u] ? par[u] = findp(par[u]) : u;
}
void unite(int u, int v) {
	u = findp(u), v = findp(v);
	par[v] = u;
}

int ans[NM];

signed main(void) {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    cin >> n >> m;
    for (int i = 1, u, v; i <= m; i++) {
    	cin >> u >> v;
    	e[i] = {u, v};
    }
    for (int i = 1, j; i < n; i++) {
    	cin >> j; s[j] = true;
    	adj[e[j][0]].push_back({e[j][1], j});
    	adj[e[j][1]].push_back({e[j][0], j});
    }
    h[1] = 0; DFS(1, 1);
    
    iota(par + 1, par + 1 + n, 1);
    int mex = 0;
    for (int i = 1; i <= m; i++) {
    	if (!ans[i]) {
    		if (s[i]) {
    			ans[i] = ++mex;
    			auto [u, v] = e[i];
    			if (h[u] > h[v]) swap(u, v);
    			unite(u, v);
    		} else {
	    		vector<int> cands;
	    		auto [u, v] = e[i];
	    		int lca = LCA(u, v);
	    		while (true) {
	    			u = findp(u), v = findp(v);
	    			if (h[u] < h[v]) swap(u, v);
	    			if (h[u] <= h[lca]) break;
	    			unite(up[u][0], u);
	    			cands.emplace_back(id[u]);
	    			u = up[u][0];
	    		}
	    		sort(begin(cands), end(cands));
	    		for (int idx: cands) ans[idx] = ++mex;
	    		ans[i] = ++mex;
	    	}
    	}
	    cout << ans[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...