颓了十多天别问我再干嘛,在补学校作业

啊,开学了……我的夏天……

【题目大意】

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

0<n,m<=2*10^4

【思路】

数组是可以利用线段树的形式可持久化的,方法和主席树一模一样。那么我们在可持久化数组的基础上加上并查集的操作就可以了。

每次合并操作,先查询要合并两个元素的父亲所在位置。方法是如果当前位置的v不等于它所代表的数组中的下标(不是当前下标),那么就继续find。其余操作并查集没有区别。

回到k次状态只要T[0]=T[k]即可。

查询是否属于一个集合也是找出父亲,直接判断即可,同并查集。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lson l,m
#define rson m+1,r
const int MAXN=;
using namespace std;
int T[MAXN],v[MAXN],h[MAXN],L[MAXN],R[MAXN];
int cnt,m,n; int build(int l,int r)
{
int rt=++cnt;
if (l==r) v[rt]=l;
else
{
int m=(l+r)>>;
L[rt]=build(lson);
R[rt]=build(rson);
}
return rt;
} int query(int rt,int x,int l,int r)
{
if (l==r) return rt;
int m=(l+r)>>;
if (x<=m) return query(L[rt],x,lson);
else return query(R[rt],x,rson);
} int find(int rt,int x)
{
int p=query(rt,x,,n);
if (x==v[p]) return p;
else return find(rt,v[p]);
} void update(int rt,int x,int l,int r)
{
if (l==r)
{
h[rt]++;
return;
}
int m=(l+r)>>;
if (x<=m) update(L[rt],x,lson);
else update(R[rt],x,rson);
} int modify(int pre,int x,int y,int l,int r)
{
int rt=++cnt;
if (l==r)
{
v[rt]=y;
h[rt]=h[pre];//不要忘了秩
return rt;
}
L[rt]=L[pre],R[rt]=R[pre];
int m=(l+r)>>;
if (x<=m) L[rt]=modify(L[pre],x,y,lson);
else R[rt]=modify(R[pre],x,y,rson);
return rt;
} void union_set(int fa,int fb,int i)
{
if (h[fa]>h[fb]) swap(fa,fb);
T[i]=modify(T[i-],v[fa],v[fb],,n);//注意这里是v[fa]而不是fa
if (h[fa]==h[fb]) update(T[i],v[fb],,n);
} void init()
{
cnt=;
scanf("%d%d",&n,&m);
T[]=build(,n);
} void solve()
{
for (int i=;i<=m;i++)
{
int op,a,b;
scanf("%d",&op);
if (op==)
{
scanf("%d%d",&a,&b);
T[i]=T[i-];
int fa=find(T[i],a),fb=find(T[i],b);
if (v[fa]!=v[fb]) union_set(fa,fb,i);
}
if (op==)
{
scanf("%d",&a);
T[i]=T[a];
}
if (op==)
{
scanf("%d%d",&a,&b);
T[i]=T[i-];
int fa=find(T[i],a),fb=find(T[i],b);
if (v[fa]==v[fb]) puts("");else puts("");
}
}
} int main()
{
init();
solve();
return ;
}

【可持久化并查集】BZOJ3673-可持久化并查集 by zky的更多相关文章

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

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

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

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

  3. [bzoj3673] 可持久化并查集 by zky

    总感觉到现在才来写这题有点奇怪. 并查集如果按秩合并的话,每次合并只会修改一个点的父亲. 用可持久化线段树来实现可持久化数组就行了.. 然而我写的是按子树大小合并..结果比按秩合并慢了一点>_& ...

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

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

  5. BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树

    既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...

  6. Redis的增删改查命令总结与持久化方式

    原文:Redis的增删改查命令总结与持久化方式 Redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快. Redis使用了单线程架构,预防了多 ...

  7. 05[掌握]高可用、集群、持久化、docker 等前置知识点

    高可用 24小时对外提供服务 高并发 同一时间段能处理的请求数 1,中心化和去中心化 1.1,中心化 意思是所有的节点都要有一个主节点 缺点:中心挂了,服务就挂了 中心处理数据的能力有限,不能把节点性 ...

  8. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  9. Redis的两种持久化方式-快照持久化(RDB)和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为“持久化”效果. redis有两 ...

  10. HBase0.99.2集群的搭建步骤(在hadoop2.6.4集群和zookeeper3.4.5集群上)

    HBase介绍(NoSql,不是关系型数据库) HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. HBase ...

随机推荐

  1. 推箱子 BFS

    [编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...

  2. vc6列表框多选时,获取哪些项被选中

    //vc6列表框多选时,获取哪些项被选中...... void CWebcyzDlg::OnButton2() { int n = m_mylist1.GetSelCount();//首先获取一共有多 ...

  3. F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解

    题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...

  4. AngularJS 指令绑定 & 简介

    指令中独立scope 的 & 官方说明: 1. 绑定表达式 2. 经常用来绑定回调函数 诡异的地方在于,这个 & 某次听人说在子组件中是不能传值给callback的,好奇查了一下官方文 ...

  5. PHP对象5: define / const /static

    define定义全局常量: define('PATH', '/data/home/www'); const也是定义常量, 一般用于类中, 饰成员属性,不可以修饰方法,如下: class Test{ c ...

  6. 64_p10

    python3-matplotlib-qt4-2.0.0-2.fc26.2.x86_64.rpm 05-Apr-2017 09:54 29438 python3-matplotlib-qt5-2.0. ...

  7. Mysql存储之ORM框架SQLAlchemy(一)

    上一篇我们说了mysql存储的原生语句方式,因为原生语句每次写都比较的复杂,所以这里我们说一种引用实体类的方式来操作数据库. 什么是ORM ORM技术:Object-Relational Mappin ...

  8. Machine Learning系列--TF-IDF模型的概率解释

    信息检索概述 信息检索是当前应用十分广泛的一种技术,论文检索.搜索引擎都属于信息检索的范畴.通常,人们把信息检索问题抽象为:在文档集合D上,对于由关键词w[1] ... w[k]组成的查询串q,返回一 ...

  9. MYSQL三种安装方式--二进制包安装

    1. 把二进制包下载到/usr/local/src下 2. 如果是tar.gz包,则使用tar zxvf 进行解压 如果是tar包,则可以使用tar xvf 进行解压 3. $ mv mysql-5. ...

  10. Oracle数据库,基础知识

    1.Oracle的五大约束条件: 1 主键  primary key2 外键  foreign key,3 唯一  unique,4 检测  check5 非空  not null 实例运用: -- ...