제출 #682051

#제출 시각아이디문제언어결과실행 시간메모리
682051Kahou조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++14
100 / 100
814 ms64716 KiB
/* In the name of God, aka Allah */
// let this be mytemp.cpp
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define endl '\n'
#define mk make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int N = 1e5 + 50;
int n, m, id[N];
vector<int> vc[N];
set<int> adj[2][N], st[N];
queue<pii> q;
ll ans;

void uniset(int u, int v) {
	u = id[u], v= id[v];
	if (u == v) return;

	if (vc[u].size() < vc[v].size()) swap(u, v);

	ans -= 1ll*st[u].size()*vc[u].size();
	ans -= 1ll*st[v].size()*vc[v].size();

	ans += 2ll*vc[u].size()*vc[v].size();
	
	for (int x:vc[v]) {
		id[x] = u;
		vc[u].push_back(x);
		st[u].erase(x);
	}
	vc[v].clear();
	for (int x:st[v]) {
		if (id[x] != u) {
			st[u].insert(x);
		}
	}
	st[v].clear();

	ans += 1ll*st[u].size()*vc[u].size();
	adj[0][u].erase(v);
	adj[1][u].erase(v);
	for (int x:adj[0][v]) {
		if (x == u) continue;

		adj[1][x].erase(v);
		adj[1][x].insert(u);

		if (adj[1][u].find(x) != adj[1][u].end()) q.push({u, x});
		adj[0][u].insert(x);
	}
	adj[0][v].clear();
	for (int x:adj[1][v]) {
		if (x == u) continue;

		adj[0][x].erase(v);
		adj[0][x].insert(u);

		if (adj[0][u].find(x) != adj[0][u].end()) q.push({u, x});
		adj[1][u].insert(x);
	}
	adj[1][v].clear();
}
void solve() {
	cin >> n >> m;
	for (int u = 1; u <= n; u++) {
		id[u] = u;
		vc[u].push_back(u);
	}
	while (m--) {
		int u, v;
		cin >> u >> v;

		v = id[v];
		if (id[u] != id[v] && st[v].find(u) == st[v].end()) {
			ans += vc[v].size();
			st[v].insert(u);
		}

		u = id[u];
		adj[0][u].insert(v);
		adj[1][v].insert(u);
		if (adj[0][v].find(u) != adj[0][v].end()) q.push({u, v});
		while (q.size()) {
			int x = q.front().F, y = q.front().S;
			q.pop();
			uniset(x, y);
		}
		cout << ans << endl;
	}
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...