【可持久化并查集】BZOJ3673-可持久化并查集 by zky
颓了十多天别问我再干嘛,在补学校作业
啊,开学了……我的夏天……
【题目大意】
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的更多相关文章
- BZOJ3673 可持久化并查集 by zky 【主席树】
BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
- [bzoj3673] 可持久化并查集 by zky
总感觉到现在才来写这题有点奇怪. 并查集如果按秩合并的话,每次合并只会修改一个点的父亲. 用可持久化线段树来实现可持久化数组就行了.. 然而我写的是按子树大小合并..结果比按秩合并慢了一点>_& ...
- 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树
[BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- Redis的增删改查命令总结与持久化方式
原文:Redis的增删改查命令总结与持久化方式 Redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快. Redis使用了单线程架构,预防了多 ...
- 05[掌握]高可用、集群、持久化、docker 等前置知识点
高可用 24小时对外提供服务 高并发 同一时间段能处理的请求数 1,中心化和去中心化 1.1,中心化 意思是所有的节点都要有一个主节点 缺点:中心挂了,服务就挂了 中心处理数据的能力有限,不能把节点性 ...
- 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- Redis的两种持久化方式-快照持久化(RDB)和AOF持久化
Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为“持久化”效果. redis有两 ...
- HBase0.99.2集群的搭建步骤(在hadoop2.6.4集群和zookeeper3.4.5集群上)
HBase介绍(NoSql,不是关系型数据库) HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. HBase ...
随机推荐
- 【leetcode 简单】第四十题 求众数
给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] 输出: 3 ...
- [006] largest_common_substring
[Description] Given two different strings, find the largest successive common substring. e.g. str1[] ...
- html的loadrunner脚本
Action(){ char strs[20]; lr_start_transaction("api_sync_order"); web_add_header("SO ...
- LAMP网站架构解释
对于大流量.大并发量的网站系统架构来说,除了硬件上使用高 性能的服务器.负载均衡.CDN等之外,在软件架构上需要重点关注下面几个环节:使用高性能的操作系统(OS).高性能的网页服务器(Web Serv ...
- Maven核心概念
一.坐标 在平面几何中,坐标(x,y)可以标识平面中唯一的一个点.在maven中,坐标是为了定位一个唯一确定的jar包.Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范:拥有了 ...
- rcnn ->fast rcnn->faster rcnn物体检测论文
faster rcnn中的rpn网络: 特征可以看做一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{1282,2562,5122}×三种比例{1:1,1: ...
- bzoj 2819(DFS序+树状数组+博弈+lca)
2819: Nim Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2045 Solved: 795[Submit][Status][Discuss] ...
- dfs序题目练习
参考博文:http://blog.csdn.net/qwe2434127/article/details/49819975 http://blog.csdn.net/qq_24489717/artic ...
- 理解 pkg-config 工具(linux编译辅助工具)
转:http://www.jb51.net/LINUXjishu/86519.html 你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源 ...
- cfg 4 ocl
http://blog.sina.com.cn/s/blog_6c868c470102v15y.html rnnlib真难装 http://sourceforge.net/p/rnnl/wiki/Ho ...