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: 可持久化并查集(可持久化并查集+启发式合并)的更多相关文章

  1. 并查集+优先队列+启发式合并 || 罗马游戏 || BZOJ 1455 || Luogu p2713

    题面:P2713 罗马游戏 题解: 超级大水题啊,特别水.. 并查集维护每个人在哪个团里,优先队列维护每个团最低分和最低分是哪位,然后每次判断一下哪些人死了,随便写写就行 并查集在Merge时可以用启 ...

  2. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  3. Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集 ...

  4. BZOJ.3673/3674.可持久化并查集(可持久化线段树 按秩合并/启发式合并)

    BZOJ 3673 BZOJ 3674(加强版) 如果每次操作最多只修改一个点的fa[],那么我们可以借助可持久化线段树来O(logn)做到.如果不考虑找fa[]的过程,时空复杂度都是O(logn). ...

  5. bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)

    Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...

  6. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

  7. 并查集+启发式合并+LCA思想 || 冷战 || BZOJ 4668

    题面:bzoj炸了,以后再补发 题解: 并查集,然后对于每个点记录它与父亲节点联通的时刻 tim ,答案显然是 u 到 v 的路径上最大的 tim 值.启发式合并,把 size 小的子树往大的上并,可 ...

  8. [BZOJ 4668]冷战(带边权并查集+启发式合并)

    [BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...

  9. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

随机推荐

  1. 大数据权限管理工具 Apache Ranger 初识

    资料参考: Apache Ranger – Introduction http://ranger.apache.org/ 阿里云 Ranger简介 Apache Ranger初识 - 阿里云 大数据权 ...

  2. Vim 文本编辑器的基本使用

    Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...

  3. 使用Flask-CKEditor集成富文本编辑框

    使用Flask-CKEditor集成富文本编辑框 富文本编辑器即所见即所得编辑器,类似于文本编辑软件.它提供一系列按钮和下拉列表来为文本设置格式,编辑状态的文本样式即最终呈现出来的样式.在Web程序中 ...

  4. AWS免费云服务套餐申请步骤及常见问题

    AWS免费云服务套餐申请步骤及常见问题 AWS免费使用套餐常见问题_AWS免费云服务套餐_-AWS云服务https://amazonaws-china.com/cn/free/faqs/ 什么是 AW ...

  5. Django MTV simple_tag filter inclusion_tag

    Django框架 模型(Model).视图(View)和控制器(Controller),具有耦合性低.重用性高.生命周期成本低等优点. MVC 框架 --  Model -View -Controll ...

  6. linux系统Centos环境下搭建SVN服务器及权限配置

    linux系统Centos环境下如何搭建SVN服务器以及svnserve.conf.authz.passwd配置文件详细介绍   至于svn的概念,这里就不做详细阐述了,可以自行百度.简单来讲就是一个 ...

  7. pic_scrapy_python

    # _*_ coding:UTF-8 _*_ import requests,json,time,sys from contextlib import closing class get_photos ...

  8. Android - Resource 之 Drawable小结

    本篇直接选择性地翻译官方开发指南 ============================= Drawable有十种类型,如下 (1) - Bitmap file:这个简单,也可以用xml来更详细的定 ...

  9. phpstorm 一个窗口打开多个项目

    参考:https://imshusheng.com/php/135.html 文件 -> 设置 -> 项目"XXX" -> Directories- > A ...

  10. 尚硅谷面试第一季-14Redis持久化类型及其区别

    课堂重点: Redis提供了两种不同形式的持久化方案,分别是RDB和AOF. RDB使用Snapshot快照做全量的存储. RDB优缺点: AOF 以日志的方式记录每个写操作,只最佳,不该写文件.增量 ...