Luogu3402【模板】可持久化并查集 (主席树)
用\(depth\)按秩合并,不能直接启发,数组开40倍左右
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int a = (b); a <= (c); ++ a)
#define nR(a,b,c) for(register int a = (b); a >= (c); -- a)
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Abs(a) ((a) < 0 ? -(a) : (a))
#define Swap(a,b) a^=b^=a^=b
#define ll long long
//#define ON_DEBUG
#ifdef ON_DEBUG
#define D_e_Line printf("\n\n----------\n\n")
#define D_e(x) cout << #x << " = " << x << endl
#define Pause() system("pause")
#define FileOpen() freopen("in.txt","r",stdin);
#else
#define D_e_Line ;
#define D_e(x) ;
#define Pause() ;
#define FileOpen() ;
#endif
struct ios{
template<typename ATP>ios& operator >> (ATP &x){
x = 0; int f = 1; char c;
for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
x*= f;
return *this;
}
}io;
using namespace std;
const int N = 200005;
int n;
int T[N], L[N * 40], R[N * 40];
int fa[N * 40], dep[N * 40];
int treeIndex;
#define lson L[rt], l, mid
#define rson R[rt], mid + 1, r
inline void Build(int &rt, int l, int r){
rt = ++treeIndex;
if(l == r){
fa[rt] = l;
return;
}
int mid = (l + r) >> 1;
Build(lson), Build(rson);
}
inline void Merge(int &rt, int pre, int l, int r, int x, int father){
rt = ++treeIndex;
if(l == r){
fa[rt] = father;
dep[rt] = dep[pre]; // inherit the last depth to union by rank
return;
}
L[rt] = L[pre], R[rt] = R[pre]; // don't forget initial this
int mid = (l + r) >> 1;
if(x <= mid)
Merge(L[rt], L[pre], l, mid, x, father);
else
Merge(R[rt], R[pre], mid + 1, r, x, father);
}
inline int Query(int rt, int l, int r, int x){
if(l == r) return rt;
int mid = (l + r) >> 1;
if(x <= mid)
return Query(lson, x);
else
return Query(rson, x);
}
inline void AddDepth(int rt, int l, int r, int x){
if(l == r){
++dep[rt]; return;
}
int mid = (l + r) >> 1;
if(x <= mid)
AddDepth(lson, x);
else
AddDepth(rson, x);
}
inline int Find(int rt, int x){
int fx = Query(rt, 1, n, x);
return x == fa[fx] ? fx : Find(rt, fa[fx]);
}
int main()
{
FileOpen();
int m;
io >> n >> m;
Build(T[0],1,n);
R(i,1,m){
int opt;
io >> opt;
switch(opt){
case 1:{
T[i] = T[i - 1]; // inherit the last edition
int x, y;
io >> x >> y;
int fx = Find(T[i], x), fy = Find(T[i], y);
if(fa[fx] == fa[fy]) continue;
if(dep[fx] > dep[fy]) Swap(fx, fy); // lighter lord heavier
Merge(T[i], T[i - 1], 1, n, fa[fx], fa[fy]);
if(dep[fx] == dep[fy]) AddDepth(T[i], 1, n, fa[fy]);
break;
}
case 2:{
int x;
io >> x;
T[i] = T[x];
break;
}
case 3:{
T[i] = T[i - 1]; // inherit the last edition
int x, y;
io >> x >> y;
int fx = Find(T[i], x), fy = Find(T[i], y);
if(fa[fx] == fa[fy])
printf("1\n");
else
printf("0\n");
break;
}
}
}
return 0;
}
Luogu3402【模板】可持久化并查集 (主席树)的更多相关文章
- 洛谷P3402 【模板】可持久化并查集 [主席树,并查集]
题目传送门 可持久化并查集 n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 ...
- BZOJ3545 [ONTAK2010]Peaks kruskal 并查集 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3545 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...
- BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3551 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...
- bzoj2733 离线+并查集+主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2733 网上清一色的合并线段树题解,我又不会,只能自己胡来,没想到Rush过去了 永无乡包含 n 座 ...
- 【学习笔记】可持久化并查集(BZOJ3673)
好久之前就想学了 然后今天恰巧一道题需要用到就学了 前置芝士 1.主席树[可持久化数组] 2.并查集 如果你掌握了前面两个那么这个东西你就会觉得非常沙茶.. 构造 可持久化并查集 = 主席树 + 并 ...
- 「luogu3402」【模板】可持久化并查集
「luogu3402」[模板]可持久化并查集 传送门 我们可以用一个可持久化数组来存每个节点的父亲. 单点信息更新和查询就用主席树多花 一个 \(\log\) 的代价来搞. 然后考虑如何合并两个点. ...
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...
- 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)
传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...
- BZOJ3673 可持久化并查集 by zky 【主席树】
BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...
- 【洛谷 P3402】 【模板】可持久化并查集
题目链接 可持久化并查集,就是用可持久化线段树维护每个版本每个节点的父亲,这样显然是不能路径压缩的,否则我们需要恢复太多状态. 但是这并不影响我们启发式合并,于是,每次把深度小的连通块向深度大的上并就 ...
随机推荐
- 免申请直接用上 IDEA 新 UI,只需要这三步配置
早上给大家介绍了IDEA官方宣布正在开发一套全新的UI,但目前是预览版需要申请才能体验. 随后马上就有网友分享了,不需要申请直接就能激活体验的方法. 本期视频:https://www.bilibili ...
- Eureka服务下线太慢,电话被告警打爆了
某年某月的某一天,就像一张破碎的脸... 错了,重来. 某天,忽然发现大量的告警,经过多番调查研究考察(此处省略3000字),发现是由于 Eureka 服务下线太慢,而仍然有大量的请求打进来导致的报错 ...
- Anaconda新建虚拟环境并添加到Jupyter Notebook
可参考:https://www.jianshu.com/p/ab9ae548b253 虚拟环境是Python的隔离工作副本.这意味着每个环境都可以具有自己的依赖关系,甚至可以具有自己的Python版本 ...
- ICDAR2013
参考:https://www.cnblogs.com/dmyu/p/6483357.html以及博主相关文章等.
- KALI2020忘记用户名和密码
时隔半年,打开kali发现忘记了自己精心研制的用户名密码......... 第一步 在开机的时候就按e键进入如下界面 第二步 用键盘上的上下箭头↑↓进行屏幕滚动,滑到最后一行发现修改目标 倒数第四行: ...
- 将 Ubuntu 16.04 LTS 的 Unity 启动器移动到桌面底部命令
将 Ubuntu 16.04 LTS 的 Unity 启动器移动到桌面底部命令: gsettings set com.canonical.Unity.Launcher launcher-positio ...
- 软件项目管理 7.5.项目进度模型(SPSP)
[公众号@ "项目管理研究所" 将会第一时间更新文章并分享<行业分析报告>] 归档于软件项目管理初级学习路线 第七章 软件项目进度计划 你猜猜里面是什么-->&l ...
- 让我们用Vue cli全家桶搭建项目
一般项目都会用到这几个,这里不在详细介绍概念,只是简单的使用.一.搭建cli 1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://regi ...
- 一篇文章带你深入浅出Vuex
在写Vuex之前,我们先用一个简单的例子来实现一个小demo 大家都知道Vue的父传子用在很多场景,比如像这样: 父组件: <template> <div id="app& ...
- LVGL库入门教程 - 颜色和图像
颜色 构造颜色 在 LVGL 中,颜色以结构 lv_color_t 表示.在最开始移植整个工程时,曾经在 lv_conf.h 中修改过颜色深度: /*Color depth: 1 (1 byte pe ...