Submission #1257009

#TimeUsernameProblemLanguageResultExecution timeMemory
1257009nguynMaking Friends on Joitter is Fun (JOI20_joitter2)C++20
100 / 100
847 ms64940 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define F first #define S second #define pb push_back #define pii pair<int, int> const int N = 1e5 + 5; int n, m; int lab[N]; ll res = 0; set<int> comp[N]; set<int> g[N], rev_g[N]; vector<pii> edges; int find(int u) { return lab[u] < 0 ? u : lab[u] = find(lab[u]); } void add(int u, int v) { g[u].insert(v); rev_g[v].insert(u); if (g[v].count(u)) { edges.pb({u, v}); } } void join(int u, int v) { if ((u = find(u)) == (v = find(v))) return; if (comp[u].size() + g[u].size() + rev_g[u].size() < comp[v].size() + g[v].size() + rev_g[v].size()) swap(u, v); res += 1ll * - lab[u] * comp[v].size(); res += 1ll * - lab[v] * comp[u].size(); for (int x : comp[v]) { if (comp[u].count(x)) { res += lab[u] + lab[v]; } else { comp[u].insert(x); } } g[u].erase(v); g[v].erase(u); rev_g[u].erase(v); rev_g[v].erase(u); for (int x : g[v]) { rev_g[x].erase(v); add(u, x); } for (int x : rev_g[v]) { g[x].erase(v); add(x, u); } lab[u] += lab[v]; lab[v] = u; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { lab[i] = -1; comp[i].insert(i); } for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; int x = find(u); int y = find(v); if (x != y && !comp[y].count(u)) { comp[y].insert(u); res -= lab[y]; add(x, y); while(!edges.empty()) { int a, b; tie(a, b) = edges.back(); edges.pop_back(); join(a, b); } } cout << res << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...