General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
154164465 Practice:
Alex_Wei
1140F - 11 C++17 (GCC 9-64) Accepted 1216 ms 132884 KB 2022-04-20 07:37:35 2022-04-20 07:37:35
→ Source
#include <bits/stdc++.h>
using namespace std;
const int V = 3e5;
const int N = V * 2 + 5;
long long ans, a[N], b[N];
int q, fa[N], sz[N];
int find(int x) {return fa[x] == x ? x : find(fa[x]);}
vector <pair <int, int>> buc[N << 2];
map <pair <int, int>, int> mp;
void modify(int l, int r, int ql, int qr, int x, auto v) {
	if(ql <= l && r <= qr) return buc[x].push_back(v), void();
	int m = l + r >> 1;
	if(ql <= m) modify(l, m, ql, qr, x << 1, v);
	if(m < qr) modify(m + 1, r, ql, qr, x << 1 | 1, v);
}
void query(int l, int r, int x) {
	long long origin = ans;
	vector <int> op;
	for(auto it : buc[x]) {
		int u = find(it.first), v = find(it.second);
		if(u == v) continue;
		if(sz[u] < sz[v]) swap(u, v);
		ans -= a[u] * b[u] + a[v] * b[v];
		fa[v] = u, sz[u] += sz[v], a[u] += a[v], b[u] += b[v];
		ans += a[u] * b[u], op.push_back(v);
	}
	if(l == r) cout << ans << " ";
	else {
		int m = l + r >> 1;
		query(l, m, x << 1), query(m + 1, r, x << 1 | 1);
	}
	reverse(op.begin(), op.end());
	for(int v : op) sz[fa[v]] -= sz[v], a[fa[v]] -= a[v], b[fa[v]] -= b[v], fa[v] = v;
	ans = origin;
}
int main() {
	cin >> q;
	for(int i = 1; i <= V; i++) fa[i] = i, sz[i] = a[i] = 1;
	for(int i = V + 1; i <= V << 1; i++) fa[i] = i, sz[i] = b[i] = 1;
	for(int i = 1; i <= q; i++) {
		int x, y;
		scanf("%d%d", &x, &y), y += V;
		pair <int, int> p = make_pair(x, y);
		if(mp.find(p) != mp.end()) modify(1, q, mp[p], i - 1, 1, p), mp.erase(p);
		else mp[p] = i;
	}
	for(auto it : mp) modify(1, q, it.second, q, 1, it.first);
	query(1, q, 1);
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details