제출 #1169727

#제출 시각아이디문제언어결과실행 시간메모리
1169727pinbu조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++20
0 / 100
5 ms9792 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100005; int par[N], sz[N]; int findp(int u) {return u ^ par[u] ? par[u] = findp(par[u]) : u;} int n, m; set<int> adj[N], out[N]; signed main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; iota(par + 1, par + 1 + n, 1); fill(sz + 1, sz + 1 + n, 1); int ans = 0; while (m--) { int u, v; cin >> u >> v; adj[u].insert(v); if (adj[v].find(u) != adj[v].end()) { int r1 = findp(u), r2 = findp(v); if (r1 ^ r2) { ans -= sz[r1] * (sz[r1] - 1) + out[r1].size() * sz[r1]; ans -= sz[r2] * (sz[r2] - 1) + out[r2].size() * sz[r2]; out[r1].erase(v); if (out[r1].size() < out[r2].size()) swap(r1, r2); par[r2] = r1; sz[r1] += sz[r2]; for (int o: out[r2]) out[r1].insert(o); ans += sz[r1] * (sz[r1] - 1) + out[r1].size() * sz[r1]; } } else { int r1 = findp(u), r2 = findp(v); if (r1 ^ r2) { if (out[r2].find(u) == out[r2].end()) { out[r2].insert(u); ans += sz[r2]; } } } cout << ans << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...