Submission #669418

#TimeUsernameProblemLanguageResultExecution timeMemory
669418hamidh100Pipes (CEOI15_pipes)C++17
10 / 100
1182 ms23392 KiB
/* In the name of God */ #include <iostream> #include <iomanip> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string> #include <string.h> #include <algorithm> #include <bitset> #include <vector> #include <stack> #include <queue> #include <set> #include <list> #include <map> #include <numeric> #include <limits> #include <limits.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> PII; typedef pair<ll, ll> PLL; typedef map<int, int> MPII; typedef vector<int> VI; typedef vector<ll> VL; #define PB push_back #define POP pop_back #define MP make_pair #define all(a) (a).begin(), (a).end() #define SORT(a) sort(all(a)) #define REVERSE(a) reverse(all(a)) #define sep ' ' #define endl '\n' #define dbg(x) cerr << '[' << #x << ": " << x << "]\n" #define dbg2(x, y) cerr << '[' << #x << ": " << x << ", " << #y << ": " << y << "]\n" #define Yes cout << "Yes\n" #define YES cout << "YES\n" #define No cout << "No\n" #define NO cout << "NO\n" #define OK cout << "OK\n" const ll INF = (ll)8e18 + 1386; const ld eps = 0.000000000000001; const int MOD = 1e9 + 7; inline int mod_add(int a, int b){ int res = a + b; return (res >= MOD? res - MOD : res); } inline int mod_neg(int a, int b){ int res = (abs(a - b) < MOD? a - b : (a - b) % MOD); return (res < 0? res + MOD : res); } inline int mod_mlt(int a, int b){ return (1ll * a * b % MOD); } inline string intToString(ll a){ char x[100]; sprintf(x, "%lld", a); string s = x; return s; } inline ll stringToInt(string s){ ll res; char x[100]; strcpy(x, s.c_str()); sscanf(x, "%lld", &res); return res; } inline void fileIO(string i, string o){ freopen(i.c_str(), "r", stdin); freopen(o.c_str(), "w", stdout); } const int MAXN = 1e5 + 1; int n, m, par[MAXN], par2[MAXN], st[MAXN], minb[MAXN], timer; VI N[MAXN]; bitset<MAXN> mark; set<PII> cnt; // map<PII, int> cnt; int getpar(int v){ return (par[v] == v ? v : par[v] = getpar(par[v])); } int getpar2(int v){ return (par2[v] == v ? v : par2[v] = getpar2(par2[v])); } void dfs(int v, int lst = 0){ mark[v] = 1; st[v] = minb[v] = timer++; for (int u : N[v]){ if (!mark[u]){ dfs(u, v); minb[v] = min(minb[v], minb[u]); if (minb[u] > st[v]) cout << u << sep << v << endl; } else if (u != lst){ // || cnt[MP(min(u, v), max(u, v))] > 1 minb[v] = min(minb[v], st[u]); } } } void merge(int u, int v){ int p1 = getpar(u), p2 = getpar(v); if (p1 == p2){ p1 = getpar2(u), p2 = getpar2(v); if (p1 != p2){ // cnt[MP(min(u, v), max(u, v))]++; if (cnt.count(MP(min(u, v), max(u, v)))) cnt.erase(MP(min(u, v), max(u, v))); else cnt.insert(MP(min(u, v), max(u, v))); N[u].PB(v), N[v].PB(u); par2[p1] = p2; } } else { // cnt[MP(min(u, v), max(u, v))]++; if (cnt.count(MP(min(u, v), max(u, v)))) cnt.erase(MP(min(u, v), max(u, v))); else cnt.insert(MP(min(u, v), max(u, v))); N[u].PB(v), N[v].PB(u); par[p1] = p2; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); iota(par, par + MAXN, 0); iota(par2, par2 + MAXN, 0); cin >> n >> m; for (int i = 0; i < m; i++){ int x, y; cin >> x >> y; merge(x, y); } for (int i = 1; i <= n; i++){ if (!mark[i]){ dfs(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...