BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=3673
思路:
可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作是差不多的,只不过是在线段树上操作。需要注意的是并查集的合并,需要按秩来进行启发式合并。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = *+; int n,m,tot;
int t[maxn*],h[maxn*]; struct node
{
int l,r,fa;
}a[maxn*]; int build(int l, int r)
{
int root = ++tot;
if(l==r) {a[root].fa = l;return root;}
int mid = (l+r)>>;
a[root].l = build(l,mid);
a[root].r = build(mid+,r);
return root;
} int query(int root, int x, int l, int r)
{
if(l==r) return root;
int mid = (l+r)>>;
if(x<=mid) return query(a[root].l,x,l,mid);
else return query(a[root].r,x,mid+,r);
} int finds(int root, int x)
{
int p = query(root,x,,n);
if(x == a[p].fa) return p;
else return finds(root,a[p].fa);
} int modify(int pre, int x, int y, int l, int r)
{
int root = ++tot;
if(l==r)
{
a[root].fa = y;
h[root] = h[pre]; //这个不能忘
return root;
}
a[root].l = a[pre].l, a[root].r = a[pre].r;
int mid = (l+r)>>;
if(x<=mid) a[root].l = modify(a[pre].l, x, y, l, mid);
else a[root].r = modify(a[pre].r, x, y, mid+, r);
return root;
} void update(int root, int x, int l, int r)
{
if(l==r) {h[root]++;return;}
int mid = (l+r)>>;
if(x<=mid) update(a[root].l,x, l, mid);
else update(a[root].r,x, mid+, r);
} void unions(int x, int y, int i)
{
if(h[x]>h[y]) swap(x,y);
t[i] = modify(t[i-],a[x].fa,a[y].fa,,n); //因为上面的交换,所以这里用fa
if(h[x]==h[y]) update(t[i],a[y].fa,,n); //如果深度相等,则插入后深度会+1
} int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
tot = ;
t[] = build(,n);
for(int i=;i<=m;i++)
{
int op;
scanf("%d",&op);
if(op==)
{
int aa,bb;
scanf("%d%d",&aa,&bb);
t[i] = t[i-];
int x = finds(t[i],aa);
int y = finds(t[i],bb);
if(a[x].fa != a[y].fa) unions(x,y,i);
}
if(op==)
{
int aa;
scanf("%d",&aa);
t[i] = t[aa];
}
if(op==)
{
int aa,bb;
scanf("%d%d",&aa,&bb);
t[i] = t[i-];
int x = finds(t[i],aa);
int y = finds(t[i],bb);
if(a[x].fa == a[y].fa) puts("");
else puts("");
}
}
return ;
}
BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)的更多相关文章
- 并查集+优先队列+启发式合并 || 罗马游戏 || BZOJ 1455 || Luogu p2713
题面:P2713 罗马游戏 题解: 超级大水题啊,特别水.. 并查集维护每个人在哪个团里,优先队列维护每个团最低分和最低分是哪位,然后每次判断一下哪些人死了,随便写写就行 并查集在Merge时可以用启 ...
- bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...
- BZOJ.3673/3674.可持久化并查集(可持久化线段树 按秩合并/启发式合并)
BZOJ 3673 BZOJ 3674(加强版) 如果每次操作最多只修改一个点的fa[],那么我们可以借助可持久化线段树来O(logn)做到.如果不考虑找fa[]的过程,时空复杂度都是O(logn). ...
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- 并查集+启发式合并+LCA思想 || 冷战 || BZOJ 4668
题面:bzoj炸了,以后再补发 题解: 并查集,然后对于每个点记录它与父亲节点联通的时刻 tim ,答案显然是 u 到 v 的路径上最大的 tim 值.启发式合并,把 size 小的子树往大的上并,可 ...
- [BZOJ 4668]冷战(带边权并查集+启发式合并)
[BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
随机推荐
- 大数据权限管理工具 Apache Ranger 初识
资料参考: Apache Ranger – Introduction http://ranger.apache.org/ 阿里云 Ranger简介 Apache Ranger初识 - 阿里云 大数据权 ...
- Vim 文本编辑器的基本使用
Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...
- 使用Flask-CKEditor集成富文本编辑框
使用Flask-CKEditor集成富文本编辑框 富文本编辑器即所见即所得编辑器,类似于文本编辑软件.它提供一系列按钮和下拉列表来为文本设置格式,编辑状态的文本样式即最终呈现出来的样式.在Web程序中 ...
- AWS免费云服务套餐申请步骤及常见问题
AWS免费云服务套餐申请步骤及常见问题 AWS免费使用套餐常见问题_AWS免费云服务套餐_-AWS云服务https://amazonaws-china.com/cn/free/faqs/ 什么是 AW ...
- Django MTV simple_tag filter inclusion_tag
Django框架 模型(Model).视图(View)和控制器(Controller),具有耦合性低.重用性高.生命周期成本低等优点. MVC 框架 -- Model -View -Controll ...
- linux系统Centos环境下搭建SVN服务器及权限配置
linux系统Centos环境下如何搭建SVN服务器以及svnserve.conf.authz.passwd配置文件详细介绍 至于svn的概念,这里就不做详细阐述了,可以自行百度.简单来讲就是一个 ...
- pic_scrapy_python
# _*_ coding:UTF-8 _*_ import requests,json,time,sys from contextlib import closing class get_photos ...
- Android - Resource 之 Drawable小结
本篇直接选择性地翻译官方开发指南 ============================= Drawable有十种类型,如下 (1) - Bitmap file:这个简单,也可以用xml来更详细的定 ...
- phpstorm 一个窗口打开多个项目
参考:https://imshusheng.com/php/135.html 文件 -> 设置 -> 项目"XXX" -> Directories- > A ...
- 尚硅谷面试第一季-14Redis持久化类型及其区别
课堂重点: Redis提供了两种不同形式的持久化方案,分别是RDB和AOF. RDB使用Snapshot快照做全量的存储. RDB优缺点: AOF 以日志的方式记录每个写操作,只最佳,不该写文件.增量 ...