bzoj 3673 可持久化并查集
本质上是维护两个可持久化数组,用可持久化线段树维护.
/**************************************************************
Problem: 3673
User: idy002
Language: C++
Result: Accepted
Time:76 ms
Memory:13780 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
#define N 20010
using namespace std; struct Node {
int u, p, s;
Node *ls, *rs;
}pool[N*], *tail=pool, *root[N]; int n, m;
Node *build( int lf, int rg ) {
Node *nd = ++tail;
if( lf==rg ) {
nd->u = lf;
nd->p = lf;
nd->s = ;
return nd;
}
int mid=(lf+rg)>>;
nd->ls = build( lf, mid );
nd->rs = build( mid+, rg );
return nd;
}
Node *modify( Node *nd, int lf, int rg, int u, int p, int s ) {
Node *nn = ++tail;
if( lf==rg ) {
nn->u = u;
nn->p = p;
nn->s = s;
return nn;
}
int mid=(lf+rg)>>;
if( u<=mid ) {
nn->ls = modify( nd->ls, lf, mid, u, p, s );
nn->rs = nd->rs;
} else {
nn->ls = nd->ls;
nn->rs = modify( nd->rs, mid+, rg, u, p, s );
}
return nn;
}
Node *query( Node *nd, int lf, int rg, int u ) {
if( lf==rg ) return nd;
int mid=(lf+rg)>>;
if( u<=mid ) return query(nd->ls,lf,mid,u);
else return query(nd->rs,mid+,rg,u);
} Node *find( Node *r, int a ) {
Node *na = query(r,,n,a);
while( na->u!=na->p ) na=query(r,,n,na->p);
return na;
}
int main() {
scanf( "%d%d", &n, &m );
root[] = build(,n);
for( int i=,opt,a,b,k; i<=m; i++ ) {
scanf( "%d", &opt );
if( opt== ) {
scanf( "%d%d", &a, &b );
root[i] = root[i-];
Node *na = find(root[i],a);
Node *nb = find(root[i],b);
if( na==nb ) continue;
if( na->s > nb->s ) swap(na,nb);
root[i] = modify( root[i], , n, na->u, nb->u, na->s );
root[i] = modify( root[i], , n, nb->u, nb->u, na->s+nb->s );
} else if( opt== ) {
scanf( "%d", &k );
root[i] = root[k];
} else {
scanf( "%d%d", &a, &b );
root[i] = root[i-];
printf( "%d\n", find(root[i],a)->u==find(root[i],b)->u );
}
}
}
bzoj 3673 可持久化并查集的更多相关文章
- 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 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...
- bzoj 3673 可持久化并查集 by zky
Description n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- 3673: 可持久化并查集 by zky
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2170 Solved: 978[Submit][Status ...
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...
随机推荐
- MySQL和Sql Server的sql语句区别
1.自增长列的插入:SQLServer中可以不为自动增长列插入值,MySQL中需要为自动增长列插入值. 2.获取当前时间函数:SQLServer写法:getdate()MySQL写法:now() 3. ...
- bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树
http://www.lydsy.com/JudgeOnline/problem.php?id=1864 #include<cstdio> #include<cstring> ...
- Kafka 温故(五):Kafka的消费编程模型
Kafka的消费模型分为两种: 1.分区消费模型 2.分组消费模型 一.分区消费模型 二.分组消费模型 Producer : package cn.outofmemory.kafka; import ...
- dedecms织梦自增索引标签
在列表中我们经常会需要动态的索引值,那么就可以用到如下标签 [field:global.autoindex/] 默认是从1开始,如果我们想从0或者从其他数开始如下: [field:autoindex ...
- jQuery下实现等待指定元素加载完毕
先声明下这个方法的使用场合,以免误导大家..比如在博客园,我们没法修改他的源代码,那么只能想办法监视元素的出现了.所以下面方法是在修改不了源码的情况下使用,而非写自己的项目.. 今天在改博客几个样式的 ...
- shell 判断文件出现次数
判断 file 文件中 第一个变量 出现次数 awk '{print $1}' file |sort |uniq -c|sort -k1r
- pip2和pip3冲突问题解决方法
python使用pip安装模块时报错:unable to create process using ' '的解决方法: 参考:http://qoogle.cn/?id=39 1.删除C:\Python ...
- vistual studio 去除 git 源代码 绑定
第一次碰到这个问题,想将源代码签入TFS管理.添加到源码管理后,默认添加到Git源码管理. 研究过后,发现: 1)删除框内文件 2)Vs->工具->选项->源代码管理->插件管 ...
- java垃圾回收的回收器
回收器的种类: --串行(–XX:+UseSerialGC ) Out ofBox算法,年轻代串行复制,年老代串行标记整理,主要用于桌面应用 --并行(–XX:+UseParallelGC ) 年轻代 ...
- Python_oldboy_自动化运维之路_面向对象(十)
面向对象编程 OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向 ...