题目: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 可持久化并查集加强版——可持久化并查集的更多相关文章

  1. BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树

    既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...

  2. 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树

    [BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...

  3. BZOJ 3674 可持久化并查集加强版 可持久化并查集

    题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...

  4. BZOJ3674 可持久化并查集加强版 可持久化 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...

  5. BZOJ 3674 可持久化并查集加强版(路径压缩版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  6. BZOJ 3674 可持久化并查集加强版(按秩合并版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  7. 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版

    可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...

  8. BZOJ 3674 可持久化并查集加强版(主席树变形)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2515  Solved: 1107 [Submit][Sta ...

  9. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

随机推荐

  1. 查询(sqlSuger)

    查某一天的数据记录的条数 DateTime date1 = Convert.ToDateTime(DateTime.Now.ToShortDateString()); DateTime date2 = ...

  2. Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'e ...

  3. java标号

    标号用于控制循环执行流程: public static void main(String[] args) { mark: for(int i = 0; i < 3; i++) { System. ...

  4. Python zipfile 编码问题

    zipfile默认对于文件名编码只识别cp437和utf-8 对于采用其他编码方式的文件,zipfile解压出来的就会是乱码 我们可以先把它encode成cp437然后再decode成GBK 最后在把 ...

  5. TClientDataSet的 AddIndex

    unit Unit2; interface uses SysUtils, Classes, DB, DBClient; type TDataModule2 = class(TDataModule) C ...

  6. ssh的配置,ssh打开密钥登陆,关闭密码登陆。

    刚装玩fedora,那么我们就以fedora为例来说一下怎么配置: 1.先确认是否已安装ssh服务: [root@localhost ~]# rpm -qa | grep openssh-server ...

  7. python字典{}大括号

    #字典 info = { 'name1':'jack', 'name2':'rose', 'name3':'tom', 'name4':'jerry', 'name5':'james' } info[ ...

  8. DevExpress v18.1新版亮点——WinForms篇(三)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v18.1 的新功能,快来下载试用新版本! ...

  9. MyEclipse移动开发教程:设置所需配置的iOS应用(二)

    MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 二.创建一个数字证书和私钥 2.2 生成证书签名请求和私钥文件 第一步是使用数字签名实用程序创建证 ...

  10. Enginering English for interview (1)

    I was lucky to work in a foreign company, Here is an overview of the interview test : 1.Because of t ...