BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/*
bzoj 3674: 可持久化并查集加强版
http://www.lydsy.com/JudgeOnline/problem.php?id=3674
用可持久化线段树维护可持久化数组从而实现可持久化并查集
可持久化线段树+并查集+按秩合并+读入优化
*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax=;
int root_fa[Nmax],root_rankk[Nmax]; inline int read()
{
int x=;char ch=getchar();
while(ch>''||ch<'')ch=getchar();
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
struct Node
{
int ls;
int rs;
int data;
};
Node fa[*Nmax];
Node rankk[*Nmax];
int n,m,ans,a,b,k;
int size_fa,size_rankk; void build_rankk(int &root,int l,int r)
{
root=size_rankk++;
int mid=(l+r)>>;
if(l==r)
{
rankk[root].data=;
return;
}
build_rankk(rankk[root].ls,l,mid);
build_rankk(rankk[root].rs,mid+,r);
} void insert_rankk(int last,int &root,int pos,int l,int r)
{
rankk[size_rankk]=rankk[last];
root=size_rankk;
size_rankk++;
if(rankk[root].ls==rankk[root].rs)
{
rankk[root].data++;
return;
}
int mid=(l+r)>>;
if(pos<=mid)
insert_rankk(rankk[last].ls,rankk[root].ls,pos,l,mid);
else
insert_rankk(rankk[last].rs,rankk[root].rs,pos,mid+,r);
} int search_rankk(int root,int pos,int l,int r)
{
if(rankk[root].ls==rankk[root].rs)
return rankk[root].data;
int mid=(l+r)>>;
if(pos<=mid)
return search_rankk(rankk[root].ls,pos,l,mid);
else
return search_rankk(rankk[root].rs,pos,mid+,r);
} void build_fa(int &root,int l,int r)
{
root=size_fa++;
int mid=(l+r)>>;
if(l==r)
{
fa[root].data=l;
return;
}
build_fa(fa[root].ls,l,mid);
build_fa(fa[root].rs,mid+,r);
} void insert_fa(int last,int &root,int pos,int data,int l,int r)
{
fa[size_fa]=fa[last];
root=size_fa;
size_fa++;
if(fa[root].ls==fa[root].rs)
{
// printf("root:%d,l:%d,data:%d\n",root,fa[root].l,data);
fa[root].data=data;
return;
}
int mid=(l+r)>>;
if(pos<=mid)
insert_fa(fa[last].ls,fa[root].ls,pos,data,l,mid);
else
insert_fa(fa[last].rs,fa[root].rs,pos,data,mid+,r);
} int search_fa(int root,int pos,int l,int r)
{
if(fa[root].ls==fa[root].rs)
return fa[root].data;
int mid=(l+r)>>;
if(pos<=mid)
return search_fa(fa[root].ls,pos,l,mid);
else
return search_fa(fa[root].rs,pos,mid+,r);
} int find(int root,int x)
{
// if(x==0)
// printf("error!!!!\n");
int fa=search_fa(root,x,,n);
if(fa!=x)
return find(root,fa);
else
return fa;
} // void watch(int root,int l,int r)
// {
// printf("tree[%d].l=%d,tree[%d].r=%d,tree[%d].data=%d\n",root,fa[root].l,root,fa[root].r,root,fa[root].data);
// if(l==r)
// return;
// int mid=(l+r)>>1;
// watch(fa[root].ls,l,mid);
// watch(fa[root].rs,mid+1,r);
// } int main()
{
freopen("bzoj3674.in","r",stdin);
//scanf("%d%d",&n,&m);
n=read();
m=read();
ans=;
int q;
build_fa(root_fa[],,n);
build_rankk(root_rankk[],,n);
// printf("the 0 watch:\n");
// watch(root_fa[0],1,n);
for(int i=;i<=m;i++)
{
//scanf("%d",&q);
q=read();
if(q==)
{
a=read();
b=read();
// scanf("%d%d",&a,&b);
a^=ans;b^=ans;
int rt1=find(root_fa[i-],a),rt2=find(root_fa[i-],b);
// printf("root[%d]=%d,root[%d]=%d\n",a,rt1,b,rt2);
if(rt1==rt2)
{
root_fa[i]=root_fa[i-];
root_rankk[i]=root_rankk[i-];
}
else
{
int rk1=search_rankk(root_rankk[i-],rt1,,n),rk2=search_rankk(root_rankk[i-],rt2,,n);
if(rk1<rk2)
{
insert_fa(root_fa[i-],root_fa[i],rt1,rt2,,n);
root_rankk[i]=root_rankk[i-];
}
else
{
insert_fa(root_fa[i-],root_fa[i],rt2,rt1,,n);
if(rk1==rk2)
insert_rankk(root_rankk[i-],root_rankk[i],rt1,,n);
else
root_rankk[i]=root_rankk[i-];
}
}
// printf("search_fa[2]=%d\n",search_fa(root_fa[1],2) );
// printf("root[%d]=%d,root[%d]=%d\n",a,find(root_fa[i],a),b,find(root_fa[i],b));
}
else if(q==)
{
k=read();
// scanf("%d",&k);
k^=ans;
root_fa[i]=root_fa[k];
root_rankk[i]=root_rankk[k];
}
else if(q==)
{
a=read();
b=read();
// scanf("%d%d",&a,&b);
root_fa[i]=root_fa[i-];
root_rankk[i]=root_rankk[i-];
a^=ans;
b^=ans;
if(find(root_fa[i],a)==find(root_fa[i],b))
ans=;
else
ans=;
printf("%d\n",ans);
}
//insert_fa(root_fa[i-1],root_fa[i],2,3);
// printf("root_fa[%d]:%d\n",i,root_fa[i]);
// printf("the %d watch:\n",i);
// watch(root_fa[i],1,n);
}
return ;
}
BZOJ 3674 可持久化并查集加强版(按秩合并版本)的更多相关文章
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
		Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ... 
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
		/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ... 
- BZOJ 3674 可持久化并查集加强版(主席树变形)
		3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ... 
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
		既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ... 
- bzoj 3674 可持久化并查集加强版——可持久化并查集
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用主席树维护 fa[ ] 和 siz[ ] .改 fa[ ] 和改 siz[ ] 都 ... 
- BZOJ 3674: 可持久化并查集加强版
		题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3674 题意:三种操作:(1)合并ab所在集合:(2)查询ab是否在一个集合:(3) ... 
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
		题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ... 
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
		http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ... 
- bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)
		CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ... 
随机推荐
- Nova和Heat中的servergroup
			如今nova能够通过命令创建一个server group,在server group中的vm能够指定一些policy. 这些policy包含affinity和anti-affinity.affinit ... 
- MVC地区多级联动扩展实现(非递归形式)
			MVC前台界面调用方式如下: @Html.AreaDropDownList(, string.Empty) 参数说明: 第一个参数控件的名称: 第二个参数选中的地区编码: 第三个参数地区层级: 第四个 ... 
- Codeforces Round #253 (Div. 1)-A,B
			A题: 由题意可知,最多翻10次就能够(事实上8次就够了).那么我们就用状态压缩表示状态. 对于某种状态,假设某一位为0,那么代表这一位不翻,否则代表这一位翻. 对于某一种翻的状态: 假设牌中有G3, ... 
- 寻找不到iframe元素
			一直找不到元素,是因为有两层iframe的 找iFrame元素方法如下 1.iFrame有ID 或者 name的情况//进入id="frame1"的frame中,定位id=&quo ... 
- 程序员(媛)Shell脚本必备技能之中的一个: 在Linux下怎样自己主动备份mysql数据
			作者:荀彧(花名) Background:鉴于QAS数据库曾遭到毁灭性损害.极其桑心L.为了避免这样的玉石俱焚的状况再度发生.于是我们找出了一种应对方案.这里给大家分享一下怎样实现定时备份mysql数 ... 
- 【视频】零基础学Android开发:蓝牙聊天室APP(一)
			零基础学Android开发:蓝牙聊天室APP第一讲 1. Android介绍与环境搭建:史上最高效Android入门学习 1.1 Google的大小战略 1.2 物联网与云计算 1.3 智能XX设备 ... 
- Error解决:Property's synthesized getter follows Cocoa naming convention for returning 'owned'
			在项目中定义了以new开头的textField.结果报错: 先看我的源代码: #import <UIKit/UIKit.h> @interface ResetPasswordViewCon ... 
- luogu1313 计算系数
			题目大意:给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m 项的系数. 将原式化为(ax+by)*(ax+by)*...①,然后将其拆解,拆解时x乘了多少次,a就乘了多少次,y,b同 ... 
- Working with macro signatures
			https://docs.kentico.com/k11/macro-expressions/troubleshooting-macros/working-with-macro-signatures ... 
- 第19章 Redis的一些常用技术
			19.1 Redis的基础事务 图19-1 Redis命令执行事务的过程 19-1:在Spring中使用Redis ... 
