【学习笔记】可持久化并查集(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:我不路径压缩就过了! ...
随机推荐
- 从Word文档粘贴内容至Web编辑器的问题
Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...
- asp.net文件断点上传
HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...
- BZOJ 4408: [Fjoi 2016]神秘数 主席树 + 神题
Code: #include<bits/stdc++.h> #define lson ls[x] #define mid ((l+r)>>1) #define rson rs[ ...
- [CSP-S模拟测试]:赛(贪心+三分)
题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...
- Java 封装 继承 多态
Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...
- PHP 常用算法【总结】
一.声明数组 ini_set("max_execution_time", "12000"); $arr = [2,4,1,7,33,4,5,6,7,11,1,0 ...
- HTML 浅层漫谈
讲到HTML最主要的就是如何给这个网页搭架子给他大致的把这个人物样子先慢慢画出来,然后我们后面去学习这个CSS还有JS的时候给这个雏形慢慢的去加一些东西,让你的网页变得越来越好看 1.标签的使用 a: ...
- 大数据学习笔记之Zookeeper(四):Zookeeper实战篇(二)
文章目录 4.1 分布式安装部署 4.2 客户端命令行操作 4.3 API应用 4.3.1 eclipse环境搭建 4.3.2 创建ZooKeeper客户端: 4.3.3 创建子节点 4.3.4 获取 ...
- UCenter 与 DIscuz 通信失败的解决方法
问题状况:Discuz 用户无法成功修改头像且帖子中上传的图片无法保存.进入 Discuz 后台检查,一切正常:进入 UCenter 检查后发现在"应用管理"中与 Discuz 论 ...
- 《JAVA设计模式》之命令模式(Command)
在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...