可持久化并查集小结

https://www.zybuluo.com/ysner/note/1253722

定义

允许恢复历史状态的并查集。

建立

\(Q\)棵主席树,每个主席树上维护当前状态并查集各个节点的父亲。
(实际上就是并查集和主席树强行捆绑在一起)

操作

每次操作前自动继承上次操作后的状态。

  • 合并\(a,b\)所在集合
    把两棵主席树按秩合并(深度大的合并到深度小的)。
    如果两棵主席树合并时深度相等,给合并后的主席树深度\(+1\)(要不然哪来的秩)

  • 回到第\(k\)次操作之后的状态
    把当前主席树的根赋值为第\(k\)棵主席树的即可。

  • 询问\(a\),\(b\)是否属于同一集合
    并查集(主)+主席树(辅)查询两者祖先,比较是否相等。

    用途

  • \(bzoj\)上刷\(AC\)
  • ???
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define ls t[x][0]
#define rs t[x][1]
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=5e6+100;
int n,m,rt[N],tot,f[N],t[N][2],d[N];
il int gi()
{re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
il void Build(re int &x,re int l,re int r)
{x=++tot;if(l==r) {f[x]=l;return;}re int mid=l+r>>1;Build(ls,l,mid);Build(rs,mid+1,r);
}
il void Modify(re int &x,re int las,re int l,re int r,re int pos,re int ff)
{x=++tot;if(l==r) {f[x]=ff;d[x]=d[las];return;}re int mid=l+r>>1;ls=t[las][0];rs=t[las][1];if(pos<=mid) Modify(ls,t[las][0],l,mid,pos,ff);else Modify(rs,t[las][1],mid+1,r,pos,ff);
}
il int Query(re int x,re int l,re int r,re int pos)
{if(l==r) return x;re int mid=l+r>>1;if(pos<=mid) return Query(ls,l,mid,pos);else return Query(rs,mid+1,r,pos);
}
il void add(re int x,re int l,re int r,re int pos)
{if(l==r) {++d[x];return;}re int mid=l+r>>1;if(pos<=mid) add(ls,l,mid,pos);else add(rs,mid+1,r,pos);
}
il int find(re int rt,re int x)
{re int fa=Query(rt,1,n,x);return x==f[fa]?fa:find(rt,f[fa]);
}
int main()
{n=gi();m=gi();Build(rt[0],1,n);fp(i,1,m){re int op=gi();if(op==1){rt[i]=rt[i-1];re int x=find(rt[i],gi()),y=find(rt[i],gi());if(f[x]==f[y]) continue;if(d[x]>d[y]) swap(x,y);Modify(rt[i],rt[i-1],1,n,f[x],f[y]);if(d[x]==d[y]) add(rt[i],1,n,f[y]);}if(op==2) rt[i]=rt[gi()];if(op==3){rt[i]=rt[i-1];re int x=find(rt[i],gi()),y=find(rt[i],gi());puts(f[x]==f[y]?"1":"0");}}return 0;
}

转载于:https://www.cnblogs.com/yanshannan/p/9495513.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 获取linux根目录下的文件夹_Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...

2020年第一波薅当当网羊毛的机会&#xff0c;别错过&#xff01;晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软&#xff0c;致力于做最好的Linux发行版。今天&#xff0c;安装Windows 10测试版本号19603的用户发现&#xff0c;系统里WSL (Windows中的Linux子系统…

HTML5效果:实现树叶飘落

实现如图所示的东西效果&#xff08;落叶下落&#xff09;&#xff1a; html代码&#xff1a; <!DOCTYPE html><html><head><title>HTML5树叶飘落动画</title><meta charset"utf-8"><meta name"viewport" content&…

Java 8 Friday Goodies:Lambda和XML

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

洛谷2619/bzoj2654 Tree(凸优化+MST)

bzoj的数据是真的水。。 qwq 由于本人还有很多东西不是很理解 qwq 所以这里只写一个正确的做法。 首先&#xff0c;我们会发现&#xff0c;对于你选择白色边的数目&#xff0c;随着数目的上涨&#xff0c;斜率是单调升高的。 那么这时候我们就可以考虑凸优化&#xff0c;也就是…

oracle 创交表,创建交叉报表(oracle)_oracle

创建交叉报表create table t1(goodid number(10) not null,saledate date not null,salesum number(10));要求生成本年度每个月的产品销售状况表m1 m2 m3 ... m12g1g2...gn下面是生成报表的sqlSELECT goodid,SUM(decode(to_char(saledate,mm),01,salesum)) "01"…

cass方格网数据excel_讨论|CASS怎么计算回字型土方? 124

大家好,欢迎来到我的专栏。这是我原创的第124篇CASS应用技术干货文章。希望对你有所帮助&#xff0c;写文不易&#xff0c;请点赞哦!回字型土方工程&#xff0c;就是计算区域内部&#xff0c;有一个或多个不参加计算的区域&#xff0c;这种区域也就是常说的“扣岛”。常见的有基…

ATM购物车程序项目规范(更新到高级版)

ATM购物车程序&#xff08;高级版&#xff09; 之前的低级版本已经删除&#xff0c;现在的内容太多&#xff0c;没时间把内容上传&#xff0c;有时间我会把项目源码奉上&#xff01; 我已经把整个项目源码传到群文件里了&#xff0c;需要的可以加主页qq群号。同时群内也有免费的…

垃圾收集器准则和提示

这些是我需要调整GC时通常会看到的一些准则和技巧。 主要由以下两本书组成&#xff0c;而根据我的经验却很少&#xff1a; Java性能 JBoss AS 5性能调优 希望它们对那里的其他人有用&#xff01; 垃圾收集器 XX:AggressiveOpts将HotSpot内部布尔变量设置为true以启用其他性…

MD5加密处理

MD5 加密后的位数一般为两种&#xff0c;16 位与 32 位。16 位实际上是从 32 位字符串中&#xff0c;取中间的第 9 位到第 24 位的部分 using System; using System.Security.Cryptography; using System.Text;namespace _04MD5加密 {internal class Program{private static vo…

php tp 支付宝 支付,php实现的支付宝网页支付功能示例【基于TP5框架】

本文实例讲述了php实现的支付宝网页支付功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.提交支付请求require_once ./payment/zfb/pagepay/service/AlipayTradeService.php;require_once ./payment/zfb/pagepay/buildermodel/AlipayTradePagePayContentBuilder.…

移动前端—H5实现图片先压缩再上传

在做移动端图片上传的时候&#xff0c;用户传的都是手机本地图片&#xff0c;而本地图片一般都相对比较大&#xff0c;拿iphone6来说&#xff0c;平时拍很多图片都是一两M的&#xff0c;如果直接这样上传&#xff0c;那图片就太大了&#xff0c;如果用户用的是移动流量&#xf…

requests模块

python requests用法总结 本文全部来源于官方文档 http://docs.python-requests.org/en/master/ 1、安装 Requests 是一个第三方 Python 模块&#xff0c;其官网的介绍如下&#xff1a; Requests 唯一的一个非转基因的 Python HTTP 库&#xff0c;人类可以安全享用。 警告&…

假期周总结六

放假第六周所做事情为&#xff1a; 1、在网上找了相关教程学习安装Hadoop,但过程中出现了许多问题&#xff0c;中途放弃了 2、继续观看关于大数据的在线课程视频转载于:https://www.cnblogs.com/DaisyYuanyq/p/9583194.html

linux子系统备份,使用LxRunOffline工具备份/还原Linux子系统(WSL)

安装WSL开启WSL组件首先需要打开WSL组件&#xff0c;可以使用以下命令&#xff1a;Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux也可以手动在【控制面板】-【程序】-【启用或关闭Windows功能】-【适用于Linux的Windows子系统】打勾&…

react打包后图片丢失_手搭一个 React,Typescript,Koa,GraphQL 环境

本文系原创&#xff0c;转载请附带作者信息&#xff1a;yhlben项目地址&#xff1a;https://github.com/yhlben/cdfang-spider前言在实际的开发过程中&#xff0c;从零开始初始化一个项目往往很麻烦&#xff0c;所以各种各样的脚手架工具应运而生。crea-react-app&#xff0c;v…

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

AngularJS XMLHttpRequest

$http 是 AngularJS 中的一个核心服务&#xff0c;用于读取远程服务器的数据。 读取 JSON 文件 下是存储在web服务器上的 JSON 文件&#xff1a; {"records": [{"Name": "Alfreds Futterkiste","City": "Berlin","Co…

使用Hazelcast发布和订阅

几周前&#xff0c;我写了一篇有关Hazelcast入门的博客&#xff0c;描述了创建分布式地图&#xff0c;列表和队列是多么简单。 当时我提到Hazelcast还能做很多其他事情。 该博客快速浏览了Hazelcast的另一个功能&#xff1a;基于Publish / Subscribe模式的广播消息系统。 这采用…

接口自动化测试持续集成--Soapui接口功能测试参数化

按照自动化测试分层实现的原理&#xff0c;每一层的脚本实现都要进行参数化&#xff0c;自动化的目标就是要实现脚本代码与测试数据分离。当测试数据进行调整的时候不会对脚本的实现带来震荡&#xff0c;从而提高脚本的稳定性与灵活度&#xff0c;降低脚本的维护成本。Soapui最…

linux的tcpdump命令详解,tcpdump命令

tcpdump命令是一款sniffer工具&#xff0c;它可以打印所有经过网络接口的数据包的头信息&#xff0c;也可以使用-w选项将数据包保存到文件中&#xff0c;方便以后分析。语法tcpdump(选项)选项-a&#xff1a;尝试将网络和广播地址转换成名称&#xff1b;-c&#xff1a;收到指定的…