首页 > 代码库 > BZOJ 3674 可持久化并查集加强版 可持久化并查集

BZOJ 3674 可持久化并查集加强版 可持久化并查集

题目大意:同3673 强制在线

同3673 仅仅只是慢了一些0.0

这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0

改代码RE的可能是内存不够

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 200200
using namespace std;
struct Tree{
	Tree *ls,*rs;
	int num;
}*fa[M],mempool[M*60],*C=mempool;
int n,m,ans,now,version[M],tot;
inline Tree* New_Node(Tree *_,Tree *__,int ___)
{
	C->ls=_;
	C->rs=__;
	C->num=___;
	return C++;
}
Tree* Modify(Tree *p,int x,int y,int pos,int val)
{
	int mid=x+y>>1;
	if(x==y)
		return New_Node(0x0,0x0,val);
	if(pos<=mid)
		return New_Node(Modify(p->ls,x,mid,pos,val),p->rs,0);
	else
		return New_Node(p->ls,Modify(p->rs,mid+1,y,pos,val),0);
}
int Access(Tree *p,int x,int y,int pos)
{
	int mid=x+y>>1;
	if(x==y)
		return p->num;
	if(pos<=mid)
		return Access(p->ls,x,mid,pos);
	else
		return Access(p->rs,mid+1,y,pos);
}
int Find(int x)
{
	int fx=Access(fa[now],1,n,x);
	if(!fx)
		return x;
	int t=Find(fx);
	Modify(fa[now],1,n,x,t);
	return t;
}
inline void Unite(int x,int y)
{
	int fx=Find(x),fy=Find(y);
	if(fx==fy)
		return;
	++tot;
	fa[tot]=Modify(fa[now],1,n,fy,fx);
	now=tot;
}
inline bool Query(int x,int y)
{
	return Find(x)==Find(y);
}
int main()
{
	int i,p,x,y;
	cin>>n>>m;
	fa[0]=New_Node(C,C,0);
	for(i=1;i<=m;i++)
	{
		scanf("%d",&p);
		switch(p)
		{
			case 1:scanf("%d%d",&x,&y),Unite(x^ans,y^ans);break;
			case 2:scanf("%d",&x),now=version[x^ans];break;
			case 3:scanf("%d%d",&x,&y),printf("%d\n",ans=Query(x^ans,y^ans));break;
		}
		version[i]=now;
	}
}



BZOJ 3674 可持久化并查集加强版 可持久化并查集