【学习笔记】可持久化并查集(BZOJ3673)
好久之前就想学了 然后今天恰巧一道题需要用到就学了
前置芝士
1.主席树[可持久化数组]
2.并查集
如果你掌握了前面两个那么这个东西你就会觉得非常沙茶。。
构造
可持久化并查集 = 主席树 + 并查集
有点蠢= =
当然 我们这里的并查集是要按秩合并的并查集
[按秩合并:就是把dep小的连接到大的上面 这个复杂度分析出来是O(lgn)的 原因不要问我 我不知道= =]
不可以路径压缩 原因好像是可以被极限数据卡掉?[我也不知道路径压缩了你怎么访问历史版本的emm。。]
这样的话 我们每次开log个节点连下来 然后对于每个点维护fa和dep就可以了
然后dep的更新就是 当两个高度一样的时候 连起来那么被连的深度需要+1
就没了qwq。
例题就是BZOJ3673 真·模板
代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define mxn 200010
#define pa pair<int,int>
#define mp make_pair
using namespace std;
struct node{int ls,rs,fa,dep;}t[mxn*40];
int cnt,rt[mxn],n;
void build(int &x,int l,int r)
{
	x=++cnt;
	if(l==r){t[x].fa=l;t[x].dep=1;return;}
	int mid=l+r>>1;
	build(t[x].ls,l,mid); build(t[x].rs,mid+1,r);
}
void insert(int &x,int lt,int l,int r,int d,int fa)
{
	x=++cnt; t[x] = t[lt];
	if(l==r){t[x].fa = fa; return;}
	int mid = l+r>>1;
	if(d<=mid) insert(t[x].ls,t[lt].ls,l,mid,d,fa);
	else	insert(t[x].rs,t[lt].rs,mid+1,r,d,fa);
}
void update(int x,int l,int r,int d)
{
	if(l==r){t[x].dep++; return;}
	int mid = l+r>>1;
	if(d<=mid)	update(t[x].ls,l,mid,d);
	else	update(t[x].rs,mid+1,r,d);
}
int query(int x,int l,int r,int d)
{
	if(l==r)	return x;
	int mid = l+r>>1;
	if(d<=mid)	return query(t[x].ls,l,mid,d);
	else	return query(t[x].rs,mid+1,r,d);
}
int find(int root,int x)
{
	int pos = query(root,1,n,x);
	if(t[pos].fa==x)	return pos;
	return find(root,t[pos].fa);
}
int main()
{
	int m,opt,x,y;
	scanf("%d%d",&n,&m);
	build(rt[0],1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&opt,&x);
		if(opt==2){rt[i]=rt[x];continue;}
		scanf("%d",&y); rt[i]=rt[i-1];
		int fx = find(rt[i],x),fy = find(rt[i],y);
		if(opt==1)
		{
			if(fx!=fy)
			{
				if(t[fx].dep < t[fy].dep)	swap(fx,fy);
				int ffx = t[fx].fa , ffy = t[fy].fa;
				insert(rt[i],rt[i-1],1,n,ffy,ffx);
				if(t[fx].dep == t[fy].dep)	update(rt[i],1,n,ffx);
			}
		}
		else	printf("%d\n",t[fx].fa==t[fy].fa);
	}
	return 0;
}【学习笔记】可持久化并查集(BZOJ3673)的更多相关文章
- [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树
		可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ... 
- BZOJ3673 可持久化并查集 by zky  【主席树】
		BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ... 
- bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集
		题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ... 
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
		bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ... 
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
		Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ... 
- 【BZOJ-3673&3674】可持久化并查集       可持久化线段树 + 并查集
		3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ... 
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky  可持久化线段树
		没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ... 
- bzoj3673可持久化并查集
		n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^ ... 
- 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树
		[BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ... 
随机推荐
- 为应用程序池 ''DefaultAppPool'' 提供服务的进程意外终止。进程 ID 是 ''xxx''问题的解决方法
			网上提供了很多办法,都未解决. 解决过程一波三折,依次用了下列方法: 1.解决办法 点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项, 选择其下的“I ... 
- Mybatis基于注解开启使用二级缓存
			关于Mybatis的一级缓存和二级缓存的概念以及理解可以参照前面文章的介绍.前文连接:https://www.cnblogs.com/hopeofthevillage/p/11427438.html, ... 
- (转)详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes
			转:https://www.cnblogs.com/justmine/p/8991379.html 写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群 ... 
- Jsoup学习和使用
			我们先看一下百度百科简介 它是java的HTML解析器 用HttpClient获取到网页后 具体的网页提取需要的信息的时候 ,就用到Jsoup,Jsoup可以使用强大的类似选择器,来获取需要的数据. ... 
- 牛客提高D6t2 破碎的序列
			分析 我们不难发现对于偶数的情况只要相邻两个数不相等即可 而对于奇数的情况只要中间恰好隔一个数的两个数不相等即可 于是我们又dp[i][0/1]表示考虑到第i位,这一位和它后面离它最近的一个确定的数是 ... 
- JS - 迭代协议
			Iteration protocols | MDN 可迭代协议(iterable protocol) 迭代器协议(iterator protocol) 
- 【转载】Spring boot学习记录(一)-入门篇
			前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 首先声明,Spring Boot不是一门新技术.从本质上来说,Spring B ... 
- HTML设置<table>的<td>横跨3列
			第一步:html中 <table> <tr> <td>列一</td> <td>列二</td> <td>列三</ ... 
- spring-第十三篇之零配置支持
			1.搜索bean类,使用注解标注spring bean. @Component:标注一个普通的spring bean类 @Controller:标注一个控制器组件类(Java EE组件) @Servi ... 
- stl(优先队列操作)
			http://codeforces.com/gym/101911/problem/C Recently Monocarp has created his own mini-laboratory! Th ... 
