Mn Zn 求助,一直 WA on test 4,人已经傻了
查看原帖
Mn Zn 求助,一直 WA on test 4,人已经傻了
112917
Eason_AC楼主2021/8/1 19:03

RT,要么就是 5th numbers differ - expected: '3', found: '1',要么就是 21st numbers differ - expected: '9', found: '5',调来调去一直错在这个点,人已经傻了。

个人认为写法没有问题,可能是哪里细节出锅了,但实在弄不出来,求调 /kel

const int N = 3e5 + 7;
int n, f[N << 1], sze1[N << 1], sze2[N << 1], h[N << 1];
ll ans;
map<pii, int> ma;
vector<pii> vec[N << 2];
struct node {
	int x, y, sz1, sz2, h;
	ll ans;
};
stack<node> q;

iv pop2() {
	int x = q.top().x, y = q.top().y;
	f[x] = x, h[y] = q.top().h, sze1[y] = q.top().sz1, sze2[y] = q.top().sz2, ans = q.top().ans;
	q.pop();
}
ii fa(int x) {return x == f[x] ? x : f[x] = fa(f[x]);}
iv unionn(int x, int y) {
	x = fa(x), y = fa(y);
	if(x == y) return;
	if(h[x] > h[y]) swap(x, y);
	f[x] = y;
	node tmp = (node){x, y, sze1[y], sze2[y], h[y], ans};
	q.push(tmp), ans -= (1ll * sze1[x] * sze2[x] + 1ll * sze1[y] * sze2[y]);
	sze1[y] += sze1[x], sze2[y] += sze2[x];
	if(h[y] == h[x]) h[y]++;
	ans += 1ll * sze1[y] * sze2[y];
}
iv update(int p, int l, int r, int x, int y, pii c) {
	if(l >= x && r <= y) return vec[p].pb(c), void();
	int mid = l + r >> 1;
	if(mid >= x) update(p * 2, l, mid, x, y, c);
	if(mid < y) update(p * 2 + 1, mid + 1, r, x, y, c);
}
iv solve(int p, int l, int r) {
	int pre = q.size();
	F(i, 0, (int)vec[p].size() - 1) unionn(vec[p][i].fi, vec[p][i].se);
	if(l == r) {
		write(ans), putchar(' ');
		while(q.size() > pre) pop2();
		return;
	}
	int mid = l + r >> 1;
	solve(p * 2, l, mid), solve(p * 2 + 1, mid + 1, r);
	while(q.size() > pre) pop2();
}

int main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	n = Rint; F(i, 1, n) {
		int x = Rint, y = Rint + 300000;
		pii tmp = mp(x, y);
		if(ma[tmp]) update(1, 1, n, ma[tmp], i - 1, tmp), ma.erase(tmp);
		else ma[tmp] = i;
	}
	F(i, 1, 300000) f[i] = i, sze1[i] = 1;
	F(i, 300001, 600000) f[i] = i, sze2[i] = 1;
	for(map<pii, int> :: iterator it = ma.begin(); it != ma.end(); ++it) update(1, 1, n, (*it).se, n, (*it).fi);
	solve(1, 1, n);
	return 0;
}
2021/8/1 19:03
加载中...