Submission #1252139

#TimeUsernameProblemLanguageResultExecution timeMemory
1252139pinbuRigged Roads (NOI19_riggedroads)C++20
100 / 100
210 ms37408 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], up0[NM]; void DFS(int u, int p) { for (auto [v, i]: adj[u]) if (v ^ p) { h[v] = h[u] + 1; id[v] = i; up0[v] = u; DFS(v, u); } } 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]; v = findp(v); while (true) { u = findp(u); if (u == v) break; if (h[u] < h[v]) swap(u, v); unite(up0[u], u); cands.emplace_back(id[u]); u = up0[u]; } 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...