社区讨论

我是霉国仁help meMLE on#9、#10 && WA on#13

P3402【模板】可持久化并查集参与者 9已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lol36o34
此快照首次捕获于
2023/11/05 14:22
2 年前
此快照最后确认于
2023/11/25 12:24
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define mid (lt+rt>>1)
#define fa(x,y) query_fa(root[x],1,n,y)
#define dep(x,y) query_dep(root[x],1,n,y)
using namespace std;
const int cxk=1e6+5;
int n,m,tot,root[cxk];
struct ikun
{
	int lt,rt,dep,fa;
}tree[cxk*54];
int build(int lt,int rt)
{
	int cur=++tot;
	if(lt==rt)
	{
		tree[cur].dep=1;
		tree[cur].fa=lt;//fa[i]=i;
		return cur;
	}
	tree[cur].lt=build(lt,mid);
	tree[cur].rt=build(mid+1,rt);
	return cur;
}
int update_fa(int cur,int lt,int rt,int q,int val)
{
	int nxt_cur=++tot;
	tree[nxt_cur]=tree[cur];
	if(lt==rt)
	{
		tree[nxt_cur].fa=val;
		return nxt_cur;
	}
	if(q<=mid)
		tree[nxt_cur].lt=update_fa(tree[cur].lt,lt,mid,q,val);
	else
		tree[nxt_cur].rt=update_fa(tree[cur].rt,mid+1,rt,q,val);
	return nxt_cur;
}
int update_dep(int cur,int lt,int rt,int q,int val)
{
	int nxt_cur=++tot;
	tree[nxt_cur]=tree[cur];
	if(lt==rt)
	{
		tree[nxt_cur].dep=val;
		return nxt_cur;
	}
	if(q<=mid)
		tree[nxt_cur].lt=update_dep(tree[cur].lt,lt,mid,q,val);
	else
		tree[nxt_cur].rt=update_dep(tree[cur].rt,mid+1,rt,q,val);
	return nxt_cur;
}
int query_fa(int cur,int lt,int rt,int q)
{
	if(lt==rt)
		return tree[cur].fa;
	if(q<=mid)
		return query_fa(tree[cur].lt,lt,mid,q);
	return query_fa(tree[cur].rt,mid+1,rt,q);	
}
int query_dep(int cur,int lt,int rt,int q)
{
	if(lt==rt)
		return tree[cur].dep;
	if(q<=mid)
		return query_dep(tree[cur].lt,lt,mid,q);
	return query_dep(tree[cur].rt,mid+1,rt,q);	
}
int find(int v,int x)
{
	//cout<<x<<" "; 
	return fa(v,x)==x?x:find(v,fa(v,x));
}
void unio(int cur,int v,int x,int y)
{
	x=fa(v,x),y=fa(v,y);
	if(dep(v,x)<dep(v,y))
		swap(x,y);
	root[cur]=update_fa(root[v],1,n,y,x);//fa[y]=x;
	if(dep(cur,x)==dep(cur,y))
	root[cur]=update_dep(root[cur],1,n,x,dep(cur,x)+1);//dep[x]=max(dep[x],dep[y]+1);
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	root[0]=build(1,n);
	for(int i=1,vrs=0,opt,x,y;i<=m;i++)
	{
		cin>>opt>>x;
		if(opt==1)
		{
			cin>>y;
			unio(i,i-1,x,y);
		}
		if(opt==2)
			root[i]=root[x];
		if(opt==3)
		{
			cin>>y;
			root[i]=root[i-1];
			cout<<(find(i,x)==find(i,y))<<"\n";
		}
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...