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日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
随机推荐
- C C++每个头文件的功能说
C/C++每个头文件的功能说明 传统 C++ #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include &l ...
- luogu1403 约数研究
题目大意:给出n,求1~n所有数的约数个数的和. 将“1~n所有数的约数”的模板中的factor[i*j].push_back(i)改为FactorCnt[i*j]++,最后再求一次和即可. #inc ...
- oc12--对象作为参数
// main.m // 对象作为方法的参数传递 #import <Foundation/Foundation.h> /* 士兵 事物名称: 士兵(Soldier) 属性:姓名(name) ...
- oc1
// zs.h #ifndef __day11__zs__ #define __day11__zs__ #include <stdio.h> int sum(int v1, int v2) ...
- 扩展函数之 IsWhat 简单好用
代码实现: /***扩展函数名细***/ //[IsInRange] ; //以前写法 & num < ) { } //现在写法 , )) { } //datetime类型也支持 //[ ...
- Dijkstra算法原理及证明(转)
Dijkstra算法及其证明 算法: 设G是带权图,图中的顶点多于一个,且所有的权都为正数.本算法确定从顶点S到G中其他各个顶点的距离和最短通路.在本算法中P表示带永久标记的顶点的集合.顶点A的前驱是 ...
- docker overlay网络实现
DOCKER的内置OVERLAY网络 内置跨主机的网络通信一直是Docker备受期待的功能,在1.9版本之前,社区中就已经有许多第三方的工具或方法尝试解决这个问题,例如Macvlan.Pipework ...
- 24. Swap Nodes in Pairs[M]两两交换链表中的节点
题目 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...
- [XJOI]noip43 T2多人背包
多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的 ...
- C - Insomnia cure
Problem description «One dragon. Two dragon. Three dragon», — the princess was counting. She had tro ...