Submission #366004

#TimeUsernameProblemLanguageResultExecution timeMemory
366004kostia244Pipes (CEOI15_pipes)C++17
100 / 100
2957 ms13688 KiB
#include<bits/stdc++.h>//memory usage is jumpting too much #define all(x) begin(x), end(x) using namespace std; using ll = long long; const int maxn = 1e5+1, lg = 11; struct dsu { int p[maxn]; dsu(int n = 0) { for(int i = 0; i <= n; i++) p[i] = -1; } int par(int i) { return p[i] < 0 ? i : p[i] = par(p[i]); } void join(int u, int v) { u = par(u), v = par(v); if(u == v) return; p[u] += p[v]; p[v] = u; } bool connected(int u, int v) { return par(u) == par(v); } }; dsu comp; int n, m; int h[maxn], eval[maxn], lval[maxn], p[maxn][lg]; array<int, 2> elist[maxn]; vector<array<int, 2>> g[maxn]; void accumulate(int v, int p, int eid) { for(auto [i, id] : g[v]) if(i != p) { accumulate(i, v, id); lval[v] += lval[i]; } if(eid != -1 && lval[v]) { eval[eid] += lval[v]; //cout << elist[eid][0] << " " << elist[eid][1] << " += " << lval[v] << endl; } } void attach(int v, int pr) { lval[v] = 0; p[v][0] = pr; for(int i = 1; i < lg; i++) { p[v][i] = p[v][i-1]; p[v][i] = p[p[v][i]][i-1]; p[v][i] = p[p[v][i]][i-1]; } for(auto [i, id] : g[v]) if(i != pr) { h[i] = h[v]+1; attach(i, v); } } int ESZ = 0; int lca(int u, int v) { if(h[u] > h[v]) swap(u, v); int dif = h[v]-h[u]; for(int i = 0; i < lg; i++) { if(dif%3) v = p[v][i], dif--; if(dif%3) v = p[v][i]; dif /= 3; } if(u == v) return u; for(int i = lg; i--;) { if(p[v][i] != p[u][i]) v = p[v][i], u = p[u][i]; if(p[v][i] != p[u][i]) v = p[v][i], u = p[u][i]; } return p[u][0]; } void add_edge(int u, int v) { if(comp.connected(u, v)) { int L = lca(u, v); //cout << u << " " << v << " lca = " << L << endl; lval[u]++, lval[v]++, lval[L] -= 2; } else { int ru = comp.par(u), rv = comp.par(v); if(-comp.p[ru] < -comp.p[rv]) swap(u, v), swap(ru, rv); //cout << u<< " is god " << endl; comp.join(ru, rv); h[v] = h[u]+1; accumulate(rv, -1, -1); attach(v, u); g[u].push_back({v, ESZ}); g[v].push_back({u, ESZ}); elist[ESZ++] = {u, v}; } } void debug(int v, int p = -1) { for(auto [i, id] : g[v]) if(i != p) { cout << v << " -> " << i << endl; debug(i, v); } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> m; comp = dsu(n+1); for(int f, t; m--;) { cin >> f >> t; add_edge(f, t); //cout << m << endl; //for(int i = 1; i <= n; i++) if(comp.par(i) == i) { // debug(i); //} } accumulate(comp.par(1), -1, -1); for(int i = 0; i < ESZ; i++) if(!eval[i]) cout << elist[i][0] << " " << elist[i][1] << '\n'; }
#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...