BZOJ3674:可持久化并查集加强版
浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3674
因为要支持历史操作,所以我们用可持久化线段树来维护并查集的祖先数组。
因为要路径压缩,所以每个点会被建\(k*logn\)次,\(k\)未知,但是绝对不大。
时间复杂度:\(O(mklogn)\)
空间复杂度:\(O(mklogn)\)
代码如下:
#include <cstdio>
using namespace std;
const int maxn=2e5+5;
int rt[maxn];
int n,m,lstans;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct tree_node {
int fa,ls,rs;
};
struct Chairman_tree {
int tot;
tree_node tree[maxn*40];
void build(int &now,int l,int r) {
now=++tot;
if(l==r) {tree[now].fa=l;return;}
int mid=(l+r)>>1;
build(tree[now].ls,l,mid);
build(tree[now].rs,mid+1,r);
}
int query(int now,int l,int r,int pos) {
if(l==r)return tree[now].fa;
int mid=(l+r)>>1;
if(pos<=mid)return query(tree[now].ls,l,mid,pos);
return query(tree[now].rs,mid+1,r,pos);
}
void change(int lst,int &now,int l,int r,int pos,int v) {
now=++tot;tree[now]=tree[lst];
if(l==r) {tree[now].fa=v;return;}
int mid=(l+r)>>1;
if(pos<=mid)change(tree[lst].ls,tree[now].ls,l,mid,pos,v);
else change(tree[lst].rs,tree[now].rs,mid+1,r,pos,v);
}
}T;
int find(int &root,int x) {
int f=T.query(root,1,n,x);
if(f==x)return x;
int res=find(root,f);
T.change(root,root,1,n,x,res);//路径压缩相当于在上一版本主席树上面更改祖先数组
return res;
}
int main() {
n=read(),m=read();
T.build(rt[0],1,n);
for(int i=1;i<=m;i++) {
int opt=read();
if(opt==1) {
int a=read()^lstans,b=read()^lstans;
int p=find(rt[i-1],a),q=find(rt[i-1],b);
if(p==q)rt[i]=rt[i-1];//如果不需要合并就不合并
else T.change(rt[i-1],rt[i],1,n,p,q);
}
else if(opt==2) {
int t=read()^lstans;
rt[i]=rt[t];
}
else if(opt==3) {
int a=read()^lstans,b=read()^lstans;
int p=find(rt[i-1],a),q=find(rt[i-1],b);
if(p==q)lstans=1;
else lstans=0;
rt[i]=rt[i-1];//询问也算操作
printf("%d\n",lstans);
}
}
return 0;
}
BZOJ3674:可持久化并查集加强版的更多相关文章
- bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
- BZOJ3674: 可持久化并查集加强版
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...
- 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)
传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...
- BZOJ3674 可持久化并查集加强版 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
- 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树
[BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- 【BZOJ3674】可持久化并查集加强版
可持久化并查集我觉得就是可持久化数组的一种应用.可持久化数组,顾名思义,就是有历史版本的数组,那么如果我们暴力修改储存的话,修改O(n)查询O(1),空间O(n*m),这样肯定不可行,那么我们发现主席 ...
- bzoj3674 可持久化并查集
我是萌萌的任意门 可持久化并查集的模板题-- 做法好像很多,可以标号法,可以森林法. 本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...
随机推荐
- Dubbo(一)Dubbo资料
这个资料绝对权威了:http://dubbo.io/user-guide/
- Tomcat安装与IDEA中的配置
下载Tomcat 先从http://tomcat.apache.org/上下载tomcat9,根据你的系统版本来下载. 本地安装 下载之后解压到你的软件安装目录中,这是我的例子: 然后设置环境变量,如 ...
- mysql-mongdb-redis
千万级别:mysql 千万以及亿级别:mongdb
- JavaWeb学习总结第四篇--Servlet开发
Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...
- 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
[BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)
本文转自博客:https://blog.csdn.net/black_3717/article/details/79769406 问题背景: 之前给客户部署我们一款EasyDSS云平台(配合EasyN ...
- Chrome 的滚动条修改.
该方法针对于win下Chrome任何版本(未测试基于Chrome内核的其他浏览器),Lunix就是目录换了一下 目录是:**\Google\Chrome\User Data\Profile 2\Use ...
- 九度OJ 1078:二叉树遍历 (二叉树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3748 解决:2263 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树 ...
- haproxy + keepalived 实现web 双主模型的高可用负载均衡
参考文章 http://xz159065974.blog.51cto.com/8618592/1405812 http://blog.chinaunix.net/uid-25266990-id-398 ...
- 20179209课后作业之od命令重写
一.问题描述: 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 3. main与其他分开,制作静态库和动态库 4. 编写Makefi ...