제출 #682112

#제출 시각아이디문제언어결과실행 시간메모리
682112MilosMilutinovicPipes (CEOI15_pipes)C++14
100 / 100
2991 ms13300 KiB
/** * author: wxhtzdy * created: 15.01.2023 19:07:48 **/ #include <bits/stdc++.h> using namespace std; const int MAX = 100000; const int L = 16; int n, m; vector<int> g[MAX]; int f[MAX]; int i; int j; int par[MAX]; int dep[MAX]; int jump[MAX][L]; int u; int v; int pu; int pv; int w; void SolveFirstSubtask() { for (i = 0; i < m; i++) { cin >> jump[i][0] >> jump[i][1]; --jump[i][0]; --jump[i][1]; } function<int(int)> getRoot = [&](int x) { return f[x] == x ? x : f[x] = getRoot(f[x]); }; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) f[j] = j; for (j = 0; j < m; j++) { if (i != j) { f[getRoot(jump[j][0])] = getRoot(jump[j][1]); } } if (getRoot(jump[i][0]) != getRoot(jump[i][1])) { cout << jump[i][0] + 1 << " " << jump[i][1] + 1 << '\n'; } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; if (n <= 100 && m <= 200) { SolveFirstSubtask(); return 0; } for (i = 0; i < n; i++) { par[i] = -1; } function<int(int)> get = [&](int x) { return par[x] < 0 ? x : par[x] = get(par[x]); }; for (i = 0; i < n; i++) { for (j = 0; j < L; j++) { jump[i][j] = i; } } function<void(int, int)> Dfs = [&](int v, int pr) { dep[v] = dep[pr] + 1; jump[v][0] = pr; for (j = 1; j < L; j++) { jump[v][j] = jump[jump[v][j - 1]][j - 1]; } for (int u : g[v]) { if (u != pr) { Dfs(u, v); } } }; auto LCA = [&](int u, int v) { if (dep[u] > dep[v]) { swap(u, v); } for (j = L - 1; j >= 0; j--) { if (dep[jump[v][j]] >= dep[u]) { v = jump[v][j]; } } if (u == v) { return u; } for (j = L - 1; j >= 0; j--) { if (jump[u][j] != jump[v][j]) { u = jump[u][j]; v = jump[v][j]; } } return jump[u][0]; }; for (i = 0; i < m; i++) { cin >> u >> v; --u; --v; if (get(u) != get(v)) { pu = get(u); pv = get(v); if (par[pu] > par[pv]) { swap(pu, pv); swap(u, v); } Dfs(v, u); g[u].push_back(v); g[v].push_back(u); par[pu] += par[pv]; par[pv] = pu; } else { w = LCA(u, v); f[u] += 1; f[v] += 1; f[w] -= 2; } } function<void(int, int)> Solve = [&](int v, int pr) { for (int u : g[v]) { if (u != pr) { Solve(u, v); f[v] += f[u]; } } if (f[v] == 0 && pr != -1) { cout << v + 1 << " " << pr + 1 << '\n'; } }; for (i = 0; i < n; i++) { if (get(i) == i) { Solve(i, -1); } } 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...