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)的民科算法--再加 ...
随机推荐
- 华为交换机设置ntp时间同步
操作交换机型号:Huawei S5720 查看时间发现时间不对 [HUAWEI]display clock 2021-04-01 21:41:35 Thursday Time Zone(Default ...
- Python Flask Blueprint 蓝图
Python Flask Blueprint 蓝图 本篇来了解一下 Flask 中 Blueprint 蓝图,什么蓝图 ..就是一个分模块的扩展而已,用来让不同的 业务模块api 分到不同的pytho ...
- Badusb 资料整理
Badusb常用代码整理 一.小马下载执行 适用于常见可执行文件 #include <Keyboard.h> void setup() { //初始化,这里的代码只执行一次 delay(5 ...
- 【原创】Python 极验滑块验证
本文仅供学习交流使用,如侵立删! 记一次 极验滑块验证分析并通过 操作环境 win10 . mac Python3.9 selenium.seleniumwire 分析 最近在做的一个项目登录时会触发 ...
- ROS机械臂 Movelt 学习笔记4 | Move Group 接口 Python
Python 的使用总是比 C++ 简单许多,Move Group 的 Python 接口更为便捷,也为使用者提供了很多用于操纵机器人和机械臂的函数,能够和 C++ 接口实现相同的功能: 设置机械臂的 ...
- 美女 Committer 手把手教你使用海豚调度
还在为选哪个调度发愁么?还在为查使用手册愁眉不展么?来来来,先瞧一眼海豚调度的 Slogan:调度选的好,下班回家早.调度用的对,半夜安心睡.为充分贯彻这一宗旨,海豚调度一条龙服务来了,特地邀请海豚社 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Spring 01: Spring配置 + IOC控制反转 + Setter注入
简介 Spring框架是一个容器,是整合其他框架的框架 他的核心是IOC(控制反转)和AOP(面向切面编程),由20多个模块构成,在很多领域都提供了优秀的问题解决方案 特点 轻量级:由20多个模块构成 ...
- ubantu安装中文失败的改正方法
情况说明 一开始我也是像博主们那样安装,但是一直在这个界面安装失败,太悲伤了!! 报错内容 c Failed to fetch http://us.archive.ubuntu.com/ubuntu/ ...
- 从0到1写一款自动为Markdown标题添加序号的Jetbrains插件
1. markdown-index 最近做了一个Jetbrains的插件,叫markdown-index,它的作用是为Markdown文档的标题自动添加序号,效果如下: 目前已经可以在Jetbrain ...