MnZn求助可持久化并查集
查看原帖
MnZn求助可持久化并查集
182792
Jie_Rans楼主2022/5/22 21:16

76pts 有WA有TLE

#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
const int N=1e5+10;
int n,m;

	int root[N],tot;
	struct Node{
		int l,r,fa,dep;
	}t[N*24];
	int build(int left,int right) {
		int p=++tot;
		if(left==right) {
			t[p].fa=left;
			t[p].dep=1;
			return p;
		}
		int mid=(left+right)>>1;
		t[p].l=build(left,mid);
		t[p].r=build(mid+1,right);
		return p;
	}
	void merge(int rt,int &p,int left,int right,int x,int Fa) {
		p=++tot;
		t[p]=t[rt];
		if(left==right) {
			t[p].dep=t[rt].dep;
			t[p].fa=Fa;
			return ;
		}
		int mid=(left+right)>>1;
		if(x<=mid) merge(t[rt].l,t[p].l,left,mid,x,Fa);
		else merge(t[rt].r,t[p].r,mid+1,right,x,Fa);
	}
	void update(int rt,int left,int right,int x) {
		if(left==right) {
			t[rt].dep++;
			return ;
		}
		int mid=(left+right)>>1;
		if(x<=mid) update(t[rt].l,left,mid,x);
		else update(t[rt].r,mid+1,right,x);
	}
	int query(int rt,int left,int right,int x) {
		if(left==right) return rt;
		int mid=(left+right)>>1;
		if(x<=mid) return query(t[rt].l,left,mid,x);
		else return query(t[rt].r,mid+1,right,x);
	}
	int find(int rt,int pos) {
		int now=query(rt,1,n,pos);
		if(t[now].fa==pos) return now;
		return find(rt,t[now].fa);
	}

int main() {
//	freopen("Cheng.in","r",stdin); 
//	freopen("Cheng.out","w",stdout);
	n=read(); m=read();
	root[0]=build(1,n);
	for(int i=1;i<=m;i++) {
		int op=read(),x=read();
		if(op==1) {
			root[i]=root[i-1];
			int y=read();
			int posx=find(root[i],x),posy=find(root[i],y);
			if(t[posx].fa==t[posy].fa) continue;
			if(t[posx].dep>t[posy].dep) swap(posx,posy);
			merge(root[i-1],root[i],1,n,t[posx].fa,t[posy].fa);
			if(t[posx].dep==t[posy].dep) update(root[i],1,n,t[posy].fa);
		}
		if(op==2) 
			root[i]=root[x];
		if(op==3) {
			root[i]=root[i-1];
			int y=read();
			int posx=find(root[i],x),posy=find(root[i],y);
			if(t[posx].fa==t[posy].fa) puts("1");
			else puts("0");
		}
	}
	return 0;
}
2022/5/22 21:16
加载中...