제출 #405060

#제출 시각아이디문제언어결과실행 시간메모리
405060BERNARB01철인 이종 경기 (APIO18_duathlon)C++17
8 / 100
36 ms3532 KiB
#include <bits/stdc++.h> using namespace std; struct dsu { int nCC; vector<int> pr, sz, rank, edges; dsu(int n) { nCC = n; pr.resize(n); sz.assign(n, 1); edges.assign(n, 0); rank.assign(n, 1); iota(pr.begin(), pr.end(), 0); } int fnd(int u) { if (u == pr[u]) { return u; } pr[u] = fnd(pr[u]); return pr[u]; } bool unate(int u, int v) { u = fnd(u); v = fnd(v); if (u == v) { edges[u]++; return false; } --nCC; if (rank[u] > rank[v]) { swap(u, v); } pr[u] = v; rank[v] += (rank[u] == rank[v]); sz[v] += sz[u]; edges[v] += 1 + edges[u]; return true; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; dsu se(n); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; --u; --v; se.unate(u, v); } vector<int> vis(n, 0); long long ans = 0; for (int i = 0; i < n; i++) { int P = se.fnd(i); if (!vis[P]) { vis[P] = 1; if (se.sz[P] > 2) { if (se.edges[P] == se.sz[P]) { ans += se.sz[P] * 1LL * (se.sz[P] - 1) * (se.sz[P] - 2); } else { ans += se.sz[P] * 1LL * (se.sz[P] - 1) * (se.sz[P] - 2) / 3; } } } } cout << ans << '\n'; 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...