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;
}