好久之前就想学了 然后今天恰巧一道题需要用到就学了

前置芝士

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)的更多相关文章

  1. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  2. BZOJ3673 可持久化并查集 by zky 【主席树】

    BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...

  3. bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集

    题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...

  4. bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版

    bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...

  5. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  6. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  7. 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树

    没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...

  8. bzoj3673可持久化并查集

    n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^ ...

  9. 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树

    [BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...

随机推荐

  1. select自定义箭头问题 。。。和一行内不同颜色的整体鼠标滑过变色

    1.select自定义箭头问题 用<select><option></option></select>的时候自带的三角箭头与需要的三角不同,这是还要求有 ...

  2. Cluster基础(一):配置iSCSI服务、编写udev规则、配置并访问NFS共享、部署Multipath多路径环境

    一.配置iSCSI服务 目标: 本案例要求先搭建好一台iSCSI服务器,并将整个磁盘共享给客户端: 虚拟机添加新的磁盘 将新添加的磁盘分区并创建两个逻辑卷 逻辑卷名称分别为:/dev/myvg/isc ...

  3. 20180708-Java基本数据类型

    public class PrimitiveTypeTest{ public static void main(String[] args){ //byte System.out.println(&q ...

  4. Intellij IDEA中如何给main方法赋args

    Intellij IDEA中如何给main方法赋args 程序: package com.otherExample; /** * Created by 谭雪娇 on 2017/3/29. */publ ...

  5. centos环境下安装java环境

    1-上java官网下载rpm安装包 jdk-7u80-linux-i586.rpm 2-新建文件夹,并把jdk-7u80-linux-i586.rpm上传到此文件夹下面 cd /usr/local/ ...

  6. 奖项-MVP:MVP(微软最有价值专家)百科

    ylbtech-奖项-MVP:MVP(微软最有价值专家)百科 微软最有价值专家(MVP) 是指具备一种或多种微软技术专业知识,并且积极参与在线或离线的社群活动,经常与其他专业人士分享知识和专业技能,受 ...

  7. 【ABAP系列】SAP LSWM处理时,网络中断,出现错误

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP LSWM处理时,网络中断 ...

  8. Python3-问题整理

    TypeError: a bytes-like object is required, not 'str' json.decoder.JSONDecodeError: Extra data json文 ...

  9. Synchronized 详解

    为了方便记忆,将锁做如下的分类 一.对象锁 包括方法锁(默认锁对象为this,当前实例对象)和同步代码块锁(自己指定锁对象) 1.代码块形式:手动指定锁定对象,也可是是this,也可以是自定义的锁 p ...

  10. memset 初始化数组 & 实现原理

    初始化数组可不必使用n重for循环. 原理 memset具有初始化数组的功能,能够初始化数组中的每一个值. 它是将数组中的每一个数的二进制的每一个字节初始化的. 比如初始化int类型的a数组:mems ...