Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)

2023-12-25 15:58

本文主要是介绍Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3673: 可持久化并查集 by zky
Time Limit: 5 Sec Memory Limit: 128 MB
Description
n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
0<=n,m<=2*10^4
Input
Output
Sample Input
5 6
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2
Sample Output
1
0
1
HINT
Source
出题人大SB

/*
可持久化线段树+启发式合并. 
可持久化线段树维护当前状态下集合的关系和秩的信息.
所谓的秩就是以该元素为代表元的所有元素中的最大深度.
然后按秩合并的目的是为了降常. 
每个叶节点维护一颗线段树 
合并的时候在权值线段树的子节点加一个数,
相当于连了一条边 表示有关系存在.
要先查询要将合并两个元素的父亲所在位置.
显然只有在两个集合秩相同时才更新秩.
*/
#include<iostream>
#include<cstdio>
#define MAXN 20001
using namespace std;
int n,m,tot,root[MAXN],s[MAXN];
struct data{int lc,rc,deep,x;}tree[MAXN*20];
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*f;
}
void build(int &k,int l,int r)
{k=++tot;if(l==r){tree[k].x=l;return ;}int mid=(l+r)>>1;build(tree[k].lc,l,mid);build(tree[k].rc,mid+1,r);return ;
}
int query(int k,int l,int r,int x)
{if(l==r) return k;int mid=(l+r)>>1;if(x<=mid) return query(tree[k].lc,l,mid,x);else return query(tree[k].rc,mid+1,r,x);
}
int find(int root,int x)
{int p=query(root,1,n,x);if(x==tree[p].x) return p;else return find(root,tree[p].x);
}
void change(int &k,int last,int l,int r,int x,int y)
{k=++tot;tree[k].lc=tree[last].lc,tree[k].rc=tree[last].rc;if(l==r) {tree[k].x=y;tree[k].deep=tree[last].deep;return ;}int mid=(l+r)>>1;if(x<=mid) change(tree[k].lc,tree[last].lc,l,mid,x,y);else change(tree[k].rc,tree[last].rc,mid+1,r,x,y);return ;
}
void updata(int k,int l,int r,int x)
{if(l==r){tree[k].deep++;return ;}int mid=(l+r)>>1;if(x<=mid) updata(tree[k].lc,l,mid,x);else updata(tree[k].rc,mid+1,r,x);return ;
}
void union_s(int l1,int l2,int i)
{if(tree[l1].deep>tree[l2].deep) swap(l1,l2);change(root[i],root[i-1],1,n,tree[l1].x,tree[l2].x);if(tree[l1].deep==tree[l2].deep) updata(root[i],1,n,tree[l2].x);return ;
}
int main()
{int x,y,z,l1,l2;n=read(),m=read();build(root[0],1,n);for(int i=1;i<=m;i++){z=read();if(z==1){x=read(),y=read();root[i]=root[i-1];l1=find(root[i],x),l2=find(root[i],y);if(tree[l1].x!=tree[l2].x) union_s(l1,l2,i);}else if(z==2) x=read(),root[i]=root[x];else {x=read(),y=read();root[i]=root[i-1];l1=find(root[i],x),l2=find(root[i],y);if(l1==l2) printf("1\n");else printf("0\n");}}return 0;
}

这篇关于Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536070

相关文章

SpringCloud之consul服务注册与发现、配置管理、配置持久化方式

《SpringCloud之consul服务注册与发现、配置管理、配置持久化方式》:本文主要介绍SpringCloud之consul服务注册与发现、配置管理、配置持久化方式,具有很好的参考价值,希望... 目录前言一、consul是什么?二、安装运行consul三、使用1、服务发现2、配置管理四、数据持久化总

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在