Submission #1169727

#TimeUsernameProblemLanguageResultExecution timeMemory
1169727pinbuMaking Friends on Joitter is Fun (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...