제출 #1220424

#제출 시각아이디문제언어결과실행 시간메모리
1220424LucaIliePipes (CEOI15_pipes)C++20
0 / 100
5092 ms22472 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5; const int MAX_LOG_N = 16; int n; int sef[MAX_N + 1], parent[MAX_LOG_N + 1][MAX_N + 1]; vector<int> vert[MAX_N]; int depth[MAX_N + 1]; int sp[MAX_N + 1]; vector<int> adj[MAX_N]; vector<pair<int, int>> edges; int findSef(int v) { if (sef[v] != v) sef[v] = findSef(sef[v]); return sef[v]; } void reroot(int u, int p) { parent[0][u] = p; depth[u] = depth[p] + 1; for (int v: adj[u]) { if (v == p) continue; reroot(v, u); } } bool connect(int u, int v) { int x = findSef(u); int y = findSef(v); if (x == y) return true; if (vert[x].size() < vert[y].size()) swap(x, y); reroot(v, u); for (int l = 1; (1 << l) <= n; l++) { for (int v: vert[y]) parent[l][v] = parent[l - 1][parent[l - 1][v]]; } for (int a: vert[y]) vert[x].push_back(a); vert[y].clear(); sef[y] = x; adj[u].push_back(v); adj[v].push_back(u); return false; } int lca(int u, int v) { if (depth[u] > depth[v]) swap(u, v); for (int l = log2(n); l >= 0; l--) { if (depth[v] - (1 << l) >= depth[u]) v = parent[l][v]; } if (u == v) return u; for (int l = log2(n); l >= 0; l--) { if (parent[l][u] != parent[l][v]) { u = parent[l][u]; v = parent[l][v]; } } return parent[0][u]; } void dfs(int u, int p) { // printf("%d %d\n", u, p); for (int v: adj[u]) { if (v == p) continue; dfs(v, u); sp[u] += sp[v]; } if (p != 0 && sp[u] == 0) cout << u << " " << p << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int m; cin >> n >> m; for (int v = 1; v <= n; v++) sef[v] = v; for (int e = 0; e < m; e++) { int u, v; cin >> u >> v; // printf("%d %d %d\n", u, v, connect(u, v)); if (connect(u, v)) edges.push_back({u, v}); } for (auto x: edges) { int u = x.first, v = x.second; int l = lca(u, v); sp[u]++; sp[v]++; sp[l] -= 2; } for (int v = 1; v <= n; v++) { int p = parent[0][v]; if (p == 0) dfs(v, 0); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...