bzoj 3674 可持久化并查集加强版——可持久化并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674
用主席树维护 fa[ ] 和 siz[ ] 。改 fa[ ] 和改 siz[ ] 都是新建节点。
写成 rt[ i ] = rt[ i-1 ] ,因为跳到第 k 步之后的那个第 k 步不一定是一个 0 操作。
找 fa 就是在当前版本的主席树查很多次。可以路径压缩,就和改 fa[ ] 一样,覆盖当前版本。不过空间会很大(n*50都不行,n*70可以),而且还变慢了?
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=2e5+,M=N*;
int n,m,rt[N],ans;
int tot,ls[M],rs[M],vl[M],siz[M];
void build(int l,int r,int cr)
{
if(l==r){vl[cr]=l;siz[cr]=;return;}
int mid=l+r>>;
ls[cr]=++tot; build(l,mid,ls[cr]);
rs[cr]=++tot; build(mid+,r,rs[cr]);
}
void ins(int l,int r,int &cr,int pr,int p,int k)
{
cr=++tot;ls[cr]=ls[pr];rs[cr]=rs[pr];
if(l==r){vl[cr]=k;siz[cr]=siz[pr];return;}
int mid=l+r>>;
if(p<=mid)ins(l,mid,ls[cr],ls[pr],p,k);
else ins(mid+,r,rs[cr],rs[pr],p,k);
}
void add(int l,int r,int &cr,int pr,int p,int k)
{
cr=++tot;ls[cr]=ls[pr];rs[cr]=rs[pr];
if(l==r){vl[cr]=vl[pr];siz[cr]=siz[pr]+k;return;}
int mid=l+r>>;
if(p<=mid)add(l,mid,ls[cr],ls[pr],p,k);
else add(mid+,r,rs[cr],rs[pr],p,k);
}
int qry(int l,int r,int cr,int p)
{
if(l==r)return cr; int mid=l+r>>;//return cr not vl for qry siz
if(p<=mid)return qry(l,mid,ls[cr],p);
else return qry(mid+,r,rs[cr],p);
}
int fnd(int nw,int a)
{
int fa=qry(,n,nw,a);
if(a==vl[fa])return fa; fa=fnd(nw,vl[fa]);
ins(,n,nw,nw,a,vl[fa]);//fa[a]=fnd(fa[a])
return fa;
}
int main()
{
n=rdn();m=rdn();
rt[]=tot=;build(,n,rt[]);
for(int i=,op,u,v;i<=m;i++)
{
op=rdn();
if(op==)
{
rt[i]=rt[i-]; u=rdn();v=rdn();
u=fnd(rt[i],u^ans); v=fnd(rt[i],v^ans);
if(vl[u]==vl[v])continue;
if(siz[u]>siz[v])swap(u,v);
u=vl[u];v=vl[v]; ins(,n,rt[i],rt[i],u,v);
add(,n,rt[i],rt[i],v,siz[u]);
}
else if(op==){ u=rdn()^ans; rt[i]=rt[u];}
else
{
rt[i]=rt[i-]; u=rdn();v=rdn();
u=vl[fnd(rt[i],u^ans)]; v=vl[fnd(rt[i],v^ans)];
ans=(u==v); printf("%d\n",ans);
}
}
return ;
}
bzoj 3674 可持久化并查集加强版——可持久化并查集的更多相关文章
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树
[BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...
- BZOJ3674 可持久化并查集加强版 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
- 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 用可持久化线段树维护可持久化数组从而实现可持 ...
- 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版
可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
随机推荐
- TABLE中动态设置poplist的值跟着当前行的某些列动态变化
核心方法 OAAdvancedTableBean table = (OAAdvancedTableBean)webBean.findChildRecursive("TimeEntryTbl& ...
- 二维数组malloc
//WC[K][N] double **WC = (double**)malloc(sizeof(double*)*K); ; i < K; i++) { WC[i] = (double*)ma ...
- Intel DAAL AI加速——支持从数据预处理到模型预测,数据源必须使用DAAL的底层封装库
数据源加速见官方文档(必须使用DAAL自己的库): Data Management Numeric Tables Tensors Data Sources Data Dictionaries Data ...
- 关于display:grid layout
.wrapper { display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; grid-auto-rows: min ...
- Maven 入门篇 ( 上 )
写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 maven 来构建运行 hello ...
- 配置pycharm 一键安装 requirements.txt,一键生成requirements.txt
如上配置 打开项目,在requirements.txt上点右键,就可以安装了. 安装效果如下: 可以看出运行的命令是 C:\Python\Python36/scripts/pip install ...
- @one to many 和 @many to one小例子
一个机构 : 多个用户 OrgTable实体类 :User实体类 OrgTable.java(一) 注解@OnetoMany,mappedBy=“org”,就是由“多”的那端维护(下面User类定义 ...
- Jena RDF API
1. jena 简单使用 RDF可以用简单的图示:包括节点以及连接节点的带有箭头的线段来理解. 这个例子中,资源 http://.../JohnSmith 表示一个人.这个人的全名是 John Sm ...
- logging- 日志记录
https://www.cnblogs.com/yyds/p/6901864.html logging提供给了两种记录日志的方式: 第一种方式是使用logging提供的模块级别的函数 import l ...
- PAT 5-9 输出华氏-摄氏温度转换表 (10分)
输入2个正整数lower和upper(lower≤\le≤upper≤\le≤100),请输出一张取值范围为[lower,upper].且每次增加2华氏度的华氏-摄氏温度转换表. 温度转换的计算公式: ...