Submission #961820

#TimeUsernameProblemLanguageResultExecution timeMemory
961820danikoynovMaking Friends on Joitter is Fun (JOI20_joitter2)C++14
100 / 100
1423 ms83252 KiB
#include <bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; const int maxn = 2e5 + 10; int n, par[maxn], m; int sz[maxn]; int find_leader(int v) { if (par[v] == v) return v; return (par[v] = find_leader(par[v])); } set < int > rem; set < int > adj[maxn]; set < int > rev_adj[maxn], child[maxn]; ll ans; queue < pair < int, int > > to_merge; void insert_weak_connection(int a, int b) { adj[a].insert(b); rev_adj[b].insert(a); if (adj[b].count(a)) to_merge.push({a, b}); } void unite(int v, int u) { if (v == u) return; if (child[v].size() < child[u].size()) swap(v, u); ans = ans + (ll)(child[v].size()) * sz[u] + (ll)(child[u].size()) * sz[v]; par[u] = v; sz[v] += sz[u]; for (int d : child[u]) { if (child[v].count(d)) ans -= sz[v]; else child[v].insert(d); } adj[v].erase(u); adj[u].erase(v); rev_adj[v].erase(u); rev_adj[u].erase(v); for (int d : adj[u]) { rev_adj[d].erase(u); insert_weak_connection(v, d); } for (int d : rev_adj[u]) { adj[d].erase(u); insert_weak_connection(d, v); } } void solve() { cin >> n >> m; for (int i = 1; i <= n; i ++) { par[i] = i; sz[i] = 1; child[i].insert(i); } for (int i = 1; i <= m; i ++) { int v, u; cin >> v >> u; u = find_leader(u); if (find_leader(v) != u && !child[u].count(v)) { child[u].insert(v); ans += sz[u]; v = find_leader(v); insert_weak_connection(v, u); while(to_merge.size()) { pair < int, int > cur = to_merge.front(); to_merge.pop(); unite(find_leader(cur.first), find_leader(cur.second)); } } cout << ans << endl; } } int main() { solve(); return 0; } /** 5 20 4 2 1 5 2 3 2 5 3 2 3 1 4 5 1 2 10 18 10 6 7 8 8 4 9 3 2 8 9 2 1 10 1 8 8 9 5 6 2 10 4 3 7 2 10 2 10 5 3 7 1 9 8 7 1 2 9 1 7 6 9 7 10 3 8 3 6 3 7 5 8 2 6 1 4 9 7 1 4 2 6 8 7 3 9 8 5 1 10 4 6 4 1 4 6 7 3 1 9 10 3 2 1 7 2 5 10 1 2 7 2 1 5 8 7 9 2 4 6 9 3 8 10 7 8 5 5 4 8 6 5 10 3 5 5 7 8 1 4 7 4 1 10 8 9 5 4 8 6 10 1 6 2 9 1 5 6 5 3 9 4 10 2 3 5 2 1 3 4 6 2 6 8 10 3 10 4 5 3 6 9 4 5 3 9 6 6 2 7 10 3 4 5 9 10 9 7 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...