【洛谷 P3402】 【模板】可持久化并查集
可持久化并查集,就是用可持久化线段树维护每个版本每个节点的父亲,这样显然是不能路径压缩的,否则我们需要恢复太多状态。
但是这并不影响我们启发式合并,于是,每次把深度小的连通块向深度大的上并就好了。
#include <cstdio>
#define re register
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar();
return s * w;
}
const int MAXN = 100010;
const int MAXM = 200010;
struct SegTree{
int lc, rc, val, dep;
}t[MAXN * 20];
int cnt, opt, a, b, root[MAXM], rt, n, m;
int build(int l, int r){
int id = ++cnt;
if(l == r){
t[id].val = l;
return id;
}
int mid = (l + r) >> 1;
t[id].lc = build(l, mid);
t[id].rc = build(mid + 1, r);
return id;
}
int query(int now, int l, int r, int x){
if(l == r) return now;
int mid = (l + r) >> 1;
return x <= mid ? query(t[now].lc, l, mid, x) : query(t[now].rc, mid + 1, r, x);
}
int update(int now, int l, int r, int x, int p){
int id = ++cnt;
t[id] = t[now];
if(l == r){ t[id].val = p; return id; }
int mid = (l + r) >> 1;
if(x <= mid) t[id].lc = update(t[now].lc, l, mid, x, p);
else t[id].rc = update(t[now].rc, mid + 1, r, x, p);
return id;
}
int find(int x){
int now = query(rt, 1, n, x);
if(t[now].val == x) return now;
return find(t[now].val);
}
void updep(int now, int l, int r, int x){
if(l == r){ ++t[now].dep; return; }
int mid = (l + r) >> 1;
if(x <= mid) updep(t[now].lc, l, mid, x);
else updep(t[now].rc, mid + 1, r, x);
}
int main(){
n = read(); m = read();
root[0] = build(1, n);
for(int i = 1; i <= m; ++i){
opt = read();
rt = root[i - 1];
if(opt == 1){
a = read(); b = read();
int fa = find(a), fb = find(b);
if(t[fa].dep < t[fb].dep){
root[i] = update(root[i - 1], 1, n, t[fa].val, t[fb].val);
if(t[fa].dep == t[fb].dep) updep(root[i], 1, n, t[fb].val);
}
else{
root[i] = update(root[i - 1], 1, n, t[fb].val, t[fa].val);
if(t[fa].dep == t[fb].dep) updep(root[i], 1, n, t[fa].val);
}
}
if(opt == 2){
rt = root[i] = root[read()];
}
if(opt == 3){
rt = root[i] = root[i - 1];
printf("%d\n", t[find(read())].val == t[find(read())].val);
}
}
return 0;
}
【洛谷 P3402】 【模板】可持久化并查集的更多相关文章
- BZOJ3673 & BZOJ3674 & 洛谷3402:可持久化并查集——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3673 https://www.lydsy.com/JudgeOnline/problem.php? ...
- 【模板】【P3402】可持久化并查集
(题面来自洛谷) 题目描述 n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 ...
- Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)
题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...
- 洛谷1525 关押罪犯NOIP2010 并查集
问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...
- 洛谷P1525 关押罪犯(并查集、二分图判定)
本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...
- 洛谷 P2661 信息传递 Label:并查集||强联通分量
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 洛谷 P1111 修复公路 Label:并查集
题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- 洛谷P1955 程序自动分析 [NOI2015] 并查集
正解:并查集+离散化 解题报告: 传送门! 其实题目还挺水的,,,但我太傻逼了直接想挂了,,,所以感觉还是有个小坑点所以还是写个题解记录下我的傻逼QAQ 首先这题一看,就长得很像NOIp关押罪犯?然后 ...
- 洛谷P3295 萌萌哒 [SCOI2016] 倍增+并查集
正解:倍增+并查集 解题报告: 传送门! 首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣 然后看下复杂度,修改是O(n2)查询是O(n),就比较容易 ...
随机推荐
- JDK源码分析 – ArrayList
ArrayList类的申明 ArrayList是一个支持泛型的,底层通过数组实现的一个可以存任意类型的数据结构,源码中的定义如下: public class ArrayList<E> ex ...
- zookeeper伪集群安装
记录下zookeeper伪分布式搭建的过程,假设系统已经配置好了JAVA环境. 1.准备环境 linux服务器一台,下载某个版本的zookeeper压缩包,下载链接:http://apache.cla ...
- thinkphp5 隐藏入口和支持pathinfo
url里public目录的隐藏 其实正常思路的话这个url里的public本身就是不存在的,然后呢,其实也不叫隐藏public目录,这里只是考虑到有些童鞋可能还会按之前3.x时代的习惯来配置网站根目录 ...
- textarea怎么解析html代码,从而实现一个可高亮的输入框
效果: 思路: 让一个div浮动在textarea上,样式和位置保持完全一致,textarea负责输入,div负责高亮显示 代码: .vue <template> <div clas ...
- do_try_to_free_pages
/* * This is the main entry point to direct page reclaim. * * If a full scan of the inactive list fa ...
- FLT_MIN,FLT_MAX,FLT_EPSILON
FLT_MIN,FLT_MAX,FLT_EPSILON * min positive value */最小的正值#define FLT_MIN 1.175494351e-38F /* max val ...
- Python文件传输模块ftplib
ftplib是基于FTP协议实现的一个Python模块 from ftplib import FTP # 创建一个FTP连接对象 ftp = FTP() #[ 当带有参数时,即:ftp = FTP(h ...
- BZOJ4137 & 洛谷4585:[FJOI2015]火星商店问题
https://www.lydsy.com/JudgeOnline/problem.php?id=4137 https://www.luogu.org/problemnew/show/P4585 火星 ...
- CSS设计一个三列布局的页面
探讨这种布局是因为最近对话框组件以及信息系统B/S界面布局的需要.无论是什么,我们在写CSS之前首先引入reset.css,我使用的是淘宝的reset. 01 /* 02 KISSY CSS Rese ...
- 项目压力测试软件 -- LoadRunner 11.0 的安装、汉化和破解
重要说明: LoadRunner 11.0 只支持Win7,32位系统:不支持Win7,64位系统[ Win7,64位 我反复安装都没有成功!] 一.下载安装.汉化.破解文件: 我的下 ...