P3402 可持久化并查集
P3402
通过主席树维护不同版本的并查集,注意要采用按秩合并的方式,路径压缩可能会爆。
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N = 3e5 + 10;
4 int n, m, rt[N * 30];
5 struct node {
6 int ls, rs, dep, fa;//fa的值都是在1~n范围中的
7 }t[N * 30];
8 namespace SegmentTree {
9 #define mid ((l + r) >> 1)
10 #define lson t[i].ls, l, mid
11 #define rson t[i].rs, mid + 1, r
12 int cnt;
13 void build(int &i, int l, int r) {
14 i = ++ cnt;
15 if (l == r) {t[i].fa = l; return ;}//初始时节点父亲就是自己
16 build(lson), build(rson);
17 }
18 void merge(int j, int &i, int l, int r, int pos1, int pos2) {
19 //pos1是深度较小的节点的fa,找到pos1的位置,将该位置的fa改为pos2,也就是合并操作
20 i = ++ cnt;
21 t[i] = t[j];//复制
22 if (l == r) {
23 t[i].fa = pos2;
24 return ;
25 }
26 if (pos1 <= mid) merge(t[j].ls, lson, pos1, pos2);
27 else merge(t[j].rs, rson, pos1, pos2);
28 }
29 void update(int i, int l, int r, int pos) {
30 if (l == r) {t[i].dep ++; return ;}
31 if (pos <= mid) update(lson, pos);
32 else update(rson, pos);
33 }
34 int query(int i, int l, int r, int pos) {//返回节点pos的编号
35 if (l == r) return i;
36 if (pos <= mid) return query(lson, pos);
37 else return query(rson, pos);
38 }
39 int find(int i, int pos) {//类似并查集找祖先操作
40 int now = query(i, 1, n, pos);
41 if (t[now].fa == pos) return now;//也是返回节点编号
42 return find(i, t[now].fa);
43 }
44 #undef mid
45 #undef lson
46 #undef rson
47 }
48 using namespace SegmentTree;
49 int main() {
50 scanf("%d %d", &n, &m);
51 build(rt[0], 1, n);
52 for (int i = 1; i <= m; i ++) {
53 int opt, x, y;
54 scanf("%d %d", &opt, &x);
55 if(opt == 1) {//合并x, y所在集合
56 scanf("%d", &y);
57 int posx, posy;
58 rt[i] = rt[i - 1];//复制新版本
59 posx = find(rt[i], x), posy = find(rt[i], y);
60 if (t[posx].fa != t[posy].fa) {//按秩合并
61 if (t[posx].dep > t[posy].dep) swap(posx, posy);
62 merge(rt[i - 1], rt[i], 1, n, t[posx].fa, t[posy].fa);
63 if (t[posx].dep == t[posy].dep) update(rt[i], 1, n, t[posy].fa);
64 //避免深度相同
65 }
66 }
67 else if(opt == 2) rt[i] = rt[x];
68 else if(opt == 3) {
69 scanf("%d", &y);
70 rt[i] = rt[i - 1];
71 int posx, posy;
72 posx = find(rt[i], x), posy = find(rt[i], y);
73 if (t[posx].fa == t[posy].fa) puts("1");
74 else puts("0");
75 }
76 }
77 return 0;
78 }
P3402 可持久化并查集的更多相关文章
- bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集
题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...
- 洛谷P3402 可持久化并查集
n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 说是可持久化并查集,实际上是 ...
- 洛谷P3402 【模板】可持久化并查集 [主席树,并查集]
题目传送门 可持久化并查集 n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 ...
- 【洛谷 P3402】 【模板】可持久化并查集
题目链接 可持久化并查集,就是用可持久化线段树维护每个版本每个节点的父亲,这样显然是不能路径压缩的,否则我们需要恢复太多状态. 但是这并不影响我们启发式合并,于是,每次把深度小的连通块向深度大的上并就 ...
- 算法笔记--可撤销并查集 && 可持久化并查集
可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...
- 带撤销并查集 & 可持久化并查集
带撤销并查集支持从某个元素从原来的集合中撤出来,然后加入到一个另外一个集合中,或者删除该元素 用一个映射来表示元素和并查集中序号的关系,代码中用\(to[x]\) 表示x号元素在并查集中的 id 删除 ...
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- bzoj3674 可持久化并查集
我是萌萌的任意门 可持久化并查集的模板题-- 做法好像很多,可以标号法,可以森林法. 本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...
随机推荐
- 【PMP学习笔记】第1章 PMP体系引论
一.什么是项目? 项目是为创造独特的产品.服务或成果而进行的临时性工作. 项目管理是把事办成的方法论,万物皆可项目. 项目的特性 临时性:有明确的"起"和"止" ...
- python type 与 metaclass理解
简介 众所周知,type在一般情况下,我们都会去获取一个对象的类型,然后进行类型的比较:除此之外,type还有一个不为人知的作用:动态的创建类.在了解这个之前,首先了解以下type和isinstanc ...
- Linux上安装java
1,输入命令,查看是否已经安装了Openjdk:rpm -qa | grep java 如果有已经安装的java版本或者版本低于1.7,卸载该jdk:rpm -e 软件包名字 如果不能卸载,可以加上 ...
- Java8新特性: CompletableFuture详解
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调.流式处理.多个Future组合处理的能力,使Java在处理多任务的 ...
- C# 从补码中获取有符号数的实际数值
C# 从补码中获取有符号数的实际数值 原理 计算机存储数据时,默认是存储数据的补码.有符号的数粗存在符号位(最高位). 这里就会提到原码.反码.补码的概念. 原码:用符号位和数值表示带符号数,正数的符 ...
- 高并发之网络IO模型
你好,我是坤哥 今天我们聊一下高并发下的网络 IO 模型 高并发即我们所说的 C10K(一个 server 服务 1w 个 client),C10M,写出高并发的程序相信是每个后端程序员的追求,高并发 ...
- PHP为任意页面设访问密码
使用方法 把下面的代码存为php文件,下面的整段代码是验证过程,然后在你入口页进行调用例如命名为MkEncrypt.php,那么在入口页进行 require_once('MkEncrypt ...
- IdentityServer4登录后无法跳转设置策略
在中间件中手动改变samesite属性为lax就可以解决问题: services.Configure<CookiePolicyOptions>(options => { option ...
- KingbaseES R6 集群修改data目录
案例说明: 本案例是在部署完成KingbaseES R6集群后,由于业务的需求,集群需要修改data(数据存储)目录的测试.本案例分两种修改方式,第一种是离线修改data目录,即关闭整个集群后,修改数 ...
- JTS TopologyException 问题
计算2个几何相交结果时候,报错了: val geometry = polygon.intersection(lineString) 日志如下 org.locationtech.jts.geom.Top ...