Submission #105083

#TimeUsernameProblemLanguageResultExecution timeMemory
105083eriksuenderhaufParachute rings (IOI12_rings)C++11
0 / 100
1770 ms102580 KiB
//#pragma GCC optimize("O3") #include <bits/stdc++.h> //#include "grader.h" #define vi vector<int> #define pb push_back using namespace std; const int MAXN = 1e6 + 5; int par[MAXN], deg[MAXN], cycle = 0, cnt[MAXN], n = 0; int mrk[MAXN]; vi cand, adj[MAXN]; int qry(int x) { return x == par[x] ? x : par[x] = qry(par[x]); } void join(int u, int v) { u = qry(u), v = qry(v); par[u] = v; } void Init(int N) { n = N; for (int i = 0; i < N; i++) { par[i] = i; cand.pb(i); mrk[i] = 1; } } void do3(int b) { vi tmp; for (int v: adj[b]) if (mrk[v]) tmp.pb(v); if (mrk[b]) tmp.pb(b); for (int v: cand) mrk[v] = 0; for (int v: tmp) mrk[v] = 1; cand = tmp; } int low[MAXN], disc[MAXN], vis[MAXN]; int t = 0, onStack[MAXN]; stack<int> st; int par2[MAXN]; void tarjan(int u, int p) { vis[u] = 1, onStack[u] = 1; disc[u] = low[u] = ++t; st.push(u); for (int v: adj[u]) { if (v == p) continue; if (!vis[v]) { tarjan(v, u); low[u] = min(low[u], low[v]); } else if (onStack[v]) { low[u] = min(low[u], disc[v]); } } if (low[u] == disc[u]) { vi tmp; int v = u; do { v = st.top(); st.pop(); tmp.pb(v); onStack[v] = 0; } while (v != u); if (tmp.size() != 1) { vi nx; for (int i: tmp) if (mrk[i] == 1) { nx.pb(i); mrk[i] = 2; } for (int i: cand) mrk[i]--; cand = nx; } } } void dfs(int u, int p) { par2[u] = p; for (int v: adj[u]) if (v != p) dfs(v, u); } void Link(int a, int b) { if (cand.empty()) return; int delta = 0; if (qry(a) == qry(b) && cycle == 0) { //tarjan(a, -1); dfs(a, -1); vi tmp = {a}; int u = b; while (u != a) { tmp.pb(u); u = par2[u]; } vi nx; for (int i: tmp) if (mrk[i] == 1) { nx.pb(i); mrk[i] = 2; } for (int i: cand) mrk[i]--; cand = nx; } adj[a].pb(b); adj[b].pb(a); if (qry(a) == qry(b)) { delta++; cycle++; } cnt[deg[a]]--; cnt[deg[b]]--; deg[a]++, deg[b]++; cnt[deg[a]]++; cnt[deg[b]]++; if (cnt[4] > 1) { cand = {}; return; } if (deg[a] > deg[b]) swap(a, b); if (deg[b] == 3) do3(b); if (deg[a] == 3) do3(a); if (deg[b] == 4) { if (!mrk[b]) { cand = {}; return; } memset(mrk, 0, sizeof mrk); mrk[b] = 1; cand = {b}; } if (cycle > 1 && delta > 0) { if (!mrk[a] && !mrk[b]) { vi tmp; for (int i: adj[a]) for (int j: adj[b]) if (i == j) tmp.pb(i); if (!tmp.empty() && !mrk[tmp[0]]) cand = {}; } else if (mrk[a] && mrk[b]) { cand = {a, b}; memset(mrk, 0, sizeof mrk); mrk[a] = 1, mrk[b] = 1; } else { if (mrk[a]) { memset(mrk, 0, sizeof mrk); mrk[a] = 1; cand = {a}; } else { memset(mrk, 0, sizeof mrk); mrk[b] = 1; cand = {b}; } } return; } join(a, b); } int CountCritical() { return cand.size(); }
#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...