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\ ...
随机推荐
- linux常用命令:touch 命令
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a ...
- 转:异常处理之ThreadException、unhandledException及多线程异常处理
转载自:http://www.cnblogs.com/levin9/articles/2319251.html 一:ThreadException和unhandledException的区别 处理未捕 ...
- python 关键字yield解析
python 关键字yield解析 yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator.y ...
- flask框架----flask-session组件
简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...
- SOAPUI 案例操作步骤
1. 构建项目 2. 运行单个请求 3. 构建测试用例 4. 接口之间传递参数 5. 运行整个测试用例 构建测试 以天气接口为例: 接口: http://ws.webxml.com.cn/WebSer ...
- Python 内置函数sorted()在高级用法
对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...
- pyqt5 点开小窗口
# -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * class Fi ...
- yii2项目中运行composer 过程中遇到的问题
问题1: Your requirements could not be resolved to an installable set of packages 则表明 未安装fxp/composer-a ...
- Golang命令行拷贝文件
package main import ( "fmt" "io" "os" ) func main() { list := os.Args ...
- 如何通过 Vue+Webpack 来做通用的前端组件化架构设计
目录: 1. 架构选型 2. 架构目录介绍 3. 架构说明 4. 招聘消息 目前如果要说比较流行的前端架构哪家强,屈指可数:reactjs.angularjs.emberj ...