可持久化并查集 Wa 96 求调
查看原帖
可持久化并查集 Wa 96 求调
724104
_i_i_楼主2023/10/20 10:50
#include <cstdio>
using namespace std;
const int MAXN = 100005;
namespace sgt {
	int val[MAXN << 6], sz[MAXN << 6], ls[MAXN << 6], rs[MAXN << 6], tot;
	void build(int &rt, int l, int r) {
		rt = ++tot; if (l == r) return val[rt] = l, sz[rt] = 1, void(); int mid = (l + r) >> 1;
		build(ls[rt], l, mid); build(rs[rt], mid + 1, r);
	}
	void modify(int rt0, int &rt, int l, int r, int x, int w) {
		rt = ++tot; val[rt] = val[rt0]; sz[rt] = sz[rt0]; ls[rt] = ls[rt0]; rs[rt] = rs[rt0];
		if (l == r) return val[rt] = w, void(); int mid = (l + r) >> 1;
		if (x <= mid) modify(ls[rt0], ls[rt], l, mid, x, w);
		else modify(rs[rt0], rs[rt], mid + 1, r, x, w);
	}
	void modify2(int rt0, int &rt, int l, int r, int x, int w) {
		rt = ++tot; val[rt] = val[rt0]; sz[rt] = sz[rt0]; ls[rt] = ls[rt0]; rs[rt] = rs[rt0];
		if (l == r) return sz[rt] = w, void(); int mid = (l + r) >> 1;
		if (x <= mid) modify2(ls[rt0], ls[rt], l, mid, x, w);
		else modify2(rs[rt0], rs[rt], mid + 1, r, x, w);
	}
	int query(int rt, int l, int r, int x) {
		if (l == r) return val[rt]; int mid = (l + r) >> 1; return x <= mid ? query(ls[rt], l, mid, x) : query(rs[rt], mid + 1, r, x);
	}
	int query2(int rt, int l, int r, int x) {
		if (l == r) return sz[rt]; int mid = (l + r) >> 1; return x <= mid ? query2(ls[rt], l, mid, x) : query2(rs[rt], mid + 1, r, x);
	}
}
int lrt[MAXN << 1], n; int findfa(int a, int v) {
	int f = sgt::query(lrt[v], 1, n, a);
	return f == a ? a : findfa(f, v);
}
int main() {
	int m; scanf("%d %d", &n, &m); sgt::build(lrt[0], 1, n);
	for (int i = 1; i <= m; i++) {
		int op, x, y; scanf("%d %d", &op, &x);
		if (op == 1) {
			scanf("%d", &y); x = findfa(x, i - 1), y = findfa(y, i - 1); int szx = sgt::query2(lrt[i - 1], 1, n, x), szy = sgt::query2(lrt[i - 1], 1, n, y);
			if (x == y) {lrt[i] = lrt[i - 1]; continue;}
			if (szx < szy) sgt::modify2(lrt[i - 1], lrt[i], 1, n, y, szx + szy), sgt::modify(lrt[i], lrt[i], 1, n, x, y);
			else sgt::modify2(lrt[i - 1], lrt[i], 1, n, x, szx + szy), sgt::modify(lrt[i], lrt[i], 1, n, y, x);
		}
		if (op == 2) lrt[i] = lrt[x];
		if (op == 3){
			lrt[i] = lrt[i - 1];
			scanf("%d", &y); x = findfa(x, i - 1), y = findfa(y, i - 1); if (x == y) puts("1"); else puts("0");
		}
	}
}
2023/10/20 10:50
加载中...