BZOJ 3673 可持久化并查集 by zky 可持久化并查集

题目大意:给定n个集合,提供三种操作:

1.合并a,b所在集合

2.回到第k次操作之后的状态

3.询问a,b是否在同一集合

可持久化并查集0.0 实现方式是用可持久化线段树实现可持久化数组维护可持久化并查集。。。

至于可持久化数组,每条路径上只有叶节点的位置的num域是有意义的,感觉无比浪费0.0 可是不这样还真没法维护0.0

合并时本来应该按照每个节点的深度之和维护,结果手残懒得写,只用siz维护了0.0

至于路径压缩,写了比不写慢0.0 还是不写了吧

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 200200
using namespace std;
struct Tree{
	Tree *ls,*rs;
	int num;
}*fa[M],*siz[M],mempool[M*40],*C=mempool;
int n,m,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);
}
inline int Find(int x)
{
	int y;
	while(x)
		x=Access(fa[now],1,n,y=x);
	return y;
}
inline void Unite(int x,int y)
{
	int fx=Find(x),fy=Find(y);
	if(fx==fy)
		return;
	++tot;
	int sx=Access(siz[now],1,n,fx);
	int sy=Access(siz[now],1,n,fy);
	if( sx<sy )
		swap(x,y),swap(fx,fy),swap(sx,sy);
	fa[tot]=Modify(fa[now],1,n,fy,fx);
	siz[tot]=Modify(siz[now],1,n,fx,sx+sy);
	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);
	siz[0]=New_Node(C,C,1);
	for(i=1;i<=m;i++)
	{
		scanf("%d",&p);
		switch(p)
		{
			case 1:scanf("%d%d",&x,&y),Unite(x,y);break;
			case 2:scanf("%d",&x),now=version[x];break;
			case 3:scanf("%d%d",&x,&y),printf("%d\n",Query(x,y));break;
		}
		version[i]=now;
	}
}
时间: 2024-07-31 17:13:33

BZOJ 3673 可持久化并查集 by zky 可持久化并查集的相关文章

BZOJ 3673: 可持久化并查集 by zky

3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2084  Solved: 941[Submit][Status][Discuss] Description n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^4 Input Output Sample Input 5 6

【BZOJ】3673: 可持久化并查集 by zky &amp; 3674: 可持久化并查集加强版(可持久化线段树)

http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id=3673 双倍经验啦啦啦.. 给主席树换了个名称果然高大上... 首先要可持久化并查集其实就是可持久化数组... 那么因为数组的形式是这样的$P[x]$,那么我们用一种数据结构实现查找x返回对应的$P[x]$即可啦啦啦. 然后那么我所学的可持久化目前只有主席树QAQ哪天去写写fhqtreap...

bzoj3673可持久化并查集 by zky&amp;&amp;bzoj3674可持久化并查集加强版

bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以使合并均摊复杂度为O(nlog2n).可持久化线段树实际上就是在更新节点时按主席树的插入方式新建一条路径(其实主席树就是可持久化权值线段树). 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm&g

【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集

这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. #include <cstdio> #include <cstring> const int N=30050; int h[N],f[N],size[N]; char s[2]; inline int find(int x){ if(f[x]==x)return x; int temp

【赵强老师】Docker Swarm集群的数据持久化

如果Docker Swarm集群中运行了mysql.nginx等服务,这些服务的数据如果没有挂载到宿主机中,那么容器一旦停止运行,那就意味着数据丢失. 有什么方法可以解决swarm集群中运行的服务能够数据持久化呢?我们可以通过volme.nfs等方法来实现swarm集群应用数据持久化,其实也和docker数据持久化的形式是一样的. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. volume NFS 共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步

Oracle数据库集群入门培训教程_Oracle RAC集群体系架构解析

课程目标 风哥本课程讲解Oracle数据库基础入门培训教程之Oracle RAC集群体系架构,内容包括:集群基本概念.Oracle RAC集群架构.Oracle RAC集群相关术语.Oracle RAC集群相关进程.Oracle RAC集群技术不同版本的变化 适用人群 IT相关从业人员,Oracle dba,在校大学生 课程简介 风哥本课程讲解Oracle数据库基础入门培训教程之Oracle RAC集群体系架构,内容包括: 一.本课内容 01.Oracle集群有哪几种 02.Oracle集群基本

搭建高可用mongodb集群(三)—— 深入副本集内部机制

http://www.lanceyan.com/tech/mongodb_repset2.html 在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性? mongodb的故障转移会不会无故自动发生?什么条件会

Hadoop集群配置心得(低配置集群+自动同步配置)

本文为本人原创,首发到炼数成金 http://f.dataguru.cn/thread-138720-1-1.html. 情况是这样的,我没有一个非常强劲的电脑来搞出一个性能非常NB的服务器集群,相信很多人也跟我差不多,所以现在把我的低配置集群经验拿出来写一下好了. 我的配备:1)五六年前的赛扬单核处理器2G内存笔记本 2)公司给配的ThinkpadT420,i5双核处理器4G内存(可用内存只有3.4G,是因为装的是32位系统的缘故吧...) 就算是用公司配置的电脑,做出来三台1G内存的虚拟机也

Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication) Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制 Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案 Apache shiro集群实现 (六)分布式集群系统下的高可用session