제출 #711674

#제출 시각아이디문제언어결과실행 시간메모리
711674PetyPipes (CEOI15_pipes)C++14
90 / 100
1975 ms11400 KiB
#include <vector> #include <iostream> #include <cassert> using namespace std; int n, m, x, y, sz[100002], p[100002], dp[20][100002], depth[100002]; vector<int>G[100002]; int find (int x) { if (p[x] == x) return x; return p[x] = find(p[x]); } void dfs2 (int x, int par) { dp[0][x] = par; depth[x] = depth[par] + 1; for (int i = 1; i <= 8; i++) dp[i][x] = dp[i - 1][dp[i - 1][x]]; for (auto it : G[x]) { if (it == par) continue; dfs2(it, x); } } int cnt; void merge (int x, int y) { int px = find(x); int py = find(y); if (px == py) return; if (sz[px] > sz[py]) { swap(x, y); swap(px, py); } G[x].push_back(y); G[y].push_back(x); p[px] = py; sz[py] += sz[px]; dfs2(x, y); } int lca (int x, int y) { if (depth[x] > depth[y]) swap(x, y); int d = depth[y] - depth[x]; for (int i = 0; (1 << i) <= d; i++) if (d & (1 << i)) y = dp[i][y]; if (x == y) return x; for (int i = 8; i >= 0; i--) if (dp[i][x] != dp[i][y]) { x = dp[i][x]; y = dp[i][y]; } return dp[0][x]; } int add[100002], viz[100002]; void dfs (int x, int par) { viz[x] = 1; for (auto it : G[x]) { if (it == par) continue; dfs(it, x); add[x] += add[it]; } if (add[x] == 0 && par != 0) cout << x << " " << par << "\n"; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { p[i] = i; sz[i] = 1; } for (int i = 1; i <= m; i++) { cin >> x >> y; if (find(x) == find(y)) { int L = lca(x, y); assert(L > 0); add[L] -= 2; add[x]++; add[y]++; } else { merge(x, y); //assert(abs(depth[x] - depth[y]) == 1); } } for (int i = 1; i <= n; i++) if (!viz[find(i)]) dfs(find(i), 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...