Submission #1226355

#TimeUsernameProblemLanguageResultExecution timeMemory
1226355rwangMaking Friends on Joitter is Fun (JOI20_joitter2)C++20
0 / 100
4 ms9792 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 1e5;

int p[N];
ll sz[N];
set<int> cmp[N];
set<int> fol[N];//nodes in each component, followers of anyone in cmp
queue<pair<int, int>> q;

int find(int x) {
    return p[x] == x ? x : p[x] = find(p[x]);
}

void merge(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) {
        return;
    }
    if (sz[x] < sz[y]) {
        swap(x, y);
    }
    for (int c : cmp[y]) {
        cmp[x].insert(c);
    }
    for (int f : fol[y]) {
        f = find(f);
        if (cmp[x].count(f) == 0) {
            fol[x].insert(f);
            if (fol[f].count(x)) {
                q.push({x, f});
            }
        }
    }
    // fol[y].clear();
    sz[x] += sz[y];
    p[y] = x;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        p[i] = i;
        sz[i] = 1;
        cmp[i].insert(i);
    }
    ll ans = 0;
    while (m--) {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        a = find(a);
        b = find(b);
        if (fol[b].count(a) == 0) {
            ans += sz[b];
        }
        fol[b].insert(a);
        if (fol[a].count(b)) {
            q.push({a, b});
        }
        while (!q.empty()) {
            int a = q.front().first, b = q.front().second;
            q.pop();
            ans -= sz[a] * (sz[a] - 1);
            ans -= fol[a].size() * sz[a];
            ans -= sz[b] * (sz[b] - 1);
            ans -= fol[b].size() * sz[b];
            fol[a].erase(b);
            fol[b].erase(a);
            merge(a, b);
            a = find(a);
            ans += sz[a] * (sz[a] - 1);
            ans += fol[a].size() * sz[a];
        }
        cout << ans << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...