Submission #711911

#TimeUsernameProblemLanguageResultExecution timeMemory
711911PetyPipes (CEOI15_pipes)C++14
60 / 100
5057 ms14096 KiB
#include <vector> #include <iostream> #include <cassert> #include <map> 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; (1 << i) < n; 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 = 19; i >= 0; i--) if ((1 << i) != n && dp[i][x] != dp[i][y]) { x = dp[i][x]; y = dp[i][y]; } return dp[0][x]; } int add[100002], viz[100002]; map<pair<int, int>, int>mp; 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"; } } void dfs3 (int x, pair<int, int> edge) { viz[x] = 1; int i = 0; for (auto it : G[x]) { if (edge == make_pair(x, it) || edge == make_pair(it, x)) { i++; continue; } if (!viz[it]) dfs3(it, edge); i++; } } 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; } // if (m <= 200) { // for (int i = 1; i <= m; i++) { // int x, y; // cin >> x >> y; // G[x].push_back(y); // G[y].push_back(x); // } // for (int x = 1; x <=n; x++) { // for (int j = 0; j < G[x].size(); j++) { // int val = G[x][j]; // for (int k = 1; k <= n; k++) // viz[k] = 0; // dfs3(x, {x, val}); // if (!viz[val] && x < val) { // cout << x << " " << val << "\n"; // } // } // } // return 0; // } for (int i = 1; i <= m; i++) { cin >> x >> y; if (x > y) swap(x, y); if (find(x) == find(y)) { add[x]++; add[y]++; int L = lca(x, y); while (x != y) { if (dp[0][x]) assert(depth[x] - 1 == depth[dp[0][x]]); if (dp[0][y]) assert(depth[y] - 1 == depth[dp[0][y]]); if (depth[x] > depth[y]) x = dp[0][x]; else y = dp[0][y]; } assert(x == L); add[L] -= 2; } 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...