Submission #113023

#TimeUsernameProblemLanguageResultExecution timeMemory
113023MAMBAPipes (CEOI15_pipes)C++17
60 / 100
5092 ms14452 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i , j , k) for (int i = j; i < (int)k; i++) #define pb push_back #define mt make_tuple #define all(x) x.begin(),x.end() typedef long long ll; typedef pair<int , int> pii; typedef pair<ll, ll> pll; typedef long double ld; typedef complex<ld> point; typedef pair<ld , ld> pld; typedef vector<int> vi; inline void fileIO(string s) { // freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } template<class T , class S> inline bool smin(T &a, S b) { return (T)b < a ? a = b , 1 : 0; } template<class T , class S> inline bool smax(T &a, S b) { return a < (T)b ? a = b , 1 : 0; } constexpr int N = 1e5 + 10; constexpr int MOD = 1e6 + 7; template<typename T> inline T mod(T &v) { return v = (v % MOD + MOD) % MOD; } template<typename S, typename T> inline S add(S &l, T r) { return mod(l += r); } int n, m; vi adj[N]; int p[N]; int get_par(int v) { if (p[v]) return p[v] = get_par(p[v]); return v; } inline bool merge(int v, int u) { v = get_par(v); u = get_par(u); if (v == u) return false; p[v] = u; return true; } bitset<N> mark; int lvl[N], par[19][N]; void dfs(int v, int pa = 0) { lvl[v] = lvl[pa] + 1; mark[v] = true; par[0][v] = pa; rep(i , 1 , 19) par[i][v] = par[i - 1][par[i - 1][v]]; for (auto e : adj[v]) if (e ^ pa) dfs(e , v); } inline int LCA(int v, int u) { if (lvl[v] < lvl[u]) swap(v, u); for (int i = 18; ~i; i--) if (lvl[par[i][v]] >= lvl[u]) v = par[i][v]; if (v == u) return v; for (int i= 18; ~i; i--) if (par[i][v] != par[i][u]) { v = par[i][v]; u = par[i][u]; } return par[0][v]; } int val[N]; void dfs2(int v , int pa = 0) { mark[v] = true; for (auto e : adj[v]) if (e ^ pa) { dfs2(e , v); val[v] += val[e]; } if (val[v] == 1) cout << v << ' ' << pa << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifndef LOCAL //fileIO("superposition"); #endif cin >> n >> m; rep(i , 0 , m) { int u , v; cin >> u >> v; if (merge(u , v)) { adj[u].pb(v); adj[v].pb(u); } } rep(i , 1 , n + 1) if (!mark[i]) dfs(i); cin.seekg(0); cin >> n >> m; rep(i , 0 , m) { int u , v; cin >> u >> v; int lca = LCA(u , v); if (lca == u || lca == v) { val[u ^ v ^ lca]++; val[lca]--; } else { val[u]++; val[v]++; val[lca] -= 2; } } mark.reset(); rep(i , 1 , n + 1) if (!mark[i]) dfs2(i); 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...