Submission #982507

#TimeUsernameProblemLanguageResultExecution timeMemory
982507michifiedDuathlon (APIO18_duathlon)C++17
100 / 100
72 ms26964 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; vector<vector<int>> adj, BCCgraph; vector<int> ord, low, siz; stack<int> st; int t = 0, cnt = 0, k, n; ll ans = 0, ss = 0; void findBCC(int cur, int par) { t++; ss++; ord[cur] = low[cur] = t; st.push(cur); for (int v : adj[cur]) { if (not ord[v]) { findBCC(v, cur); low[cur] = min(low[cur], low[v]); if (low[v] == ord[cur]) { k++; int tmp = -1; BCCgraph[cur].push_back(k); while (tmp != v) { tmp = st.top(); st.pop(); BCCgraph[k].push_back(tmp); } } } low[cur] = min(low[cur], ord[v]); } } void subtract(int cur) { siz[cur] = cur < n; for (int v : BCCgraph[cur]) { subtract(v); siz[cur] += siz[v]; if (cur >= n) ans -= BCCgraph[cur].size() * siz[v] * (siz[v] - 1); } if (cur >= n) ans -= BCCgraph[cur].size() * (ss - siz[cur]) * (ss - siz[cur] - 1); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll m, u, v; cin >> n >> m; ord.resize(n); adj.resize(n); low.resize(n); BCCgraph.resize(n * 2 + 1); siz.resize(n * 2 + 1); k = n - 1; int i; for (i = 0; i < m; i++) { cin >> u >> v; u--; v--; adj[u].push_back(v); adj[v].push_back(u); } for (i = 0; i < n; i++) { if (not ord[i]) { ss = 0; findBCC(i, -1); ans += ss * (ss - 1) * (ss - 2); subtract(i); } } cout << ans; }
#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...