bzoj 3674: 可持久化并查集加强版

62人阅读 评论(0) 收藏 举报
分类:

题目链接


【想说的话】

rope大法好*2


【题解】

和我的上一篇没有什么区别

需要注意的是 xor 和 MLE 问题

MLE的解决办法是路径压缩时如果可以不更新就不更新

我第一次知道这种东西可以这么缩内存....


【代码】

#include<bits/stdc++.h>
#include<ext/rope>

#define MAXN 200020

using namespace std;
using namespace __gnu_cxx;

inline int rd(){
	int x=0,y=1;char c=getchar();
	while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*y;
}

int n,m;
rope<int> *rp[MAXN];
int a[MAXN];

inline int fa(int i,int x){
	return rp[i]->at(x);
}

int getroot(int i,int x){
	if(fa(i,x)==x)return x;
	int f=getroot(i,fa(i,x));
	if(fa(i,x)!=f)rp[i]->replace(x,f);
	return f;
}

inline void un(int i,int x,int y){
	x=getroot(i,x);
	y=getroot(i,y);
	if(x==y)return;
	rp[i]->replace(x,y);
}

int main(){
	n=rd(),m=rd();
	for(int i=1; i<=n; i++)a[i]=i;
	rp[0]=new rope<int>(a,a+n+1);
	int i=0,lastans=0;
	while(m--){
		i++;
		rp[i]=new rope<int>(*rp[i-1]);
		int x=rd(),y,z;
		if(x==1)y=rd()^lastans,z=rd()^lastans,un(i,y,z);
		else if(x==2)y=rd()^lastans,rp[i]=new rope<int>(*rp[y]);
		else y=rd()^lastans,z=rd()^lastans,printf("%d\n",lastans=getroot(i,y)==getroot(i,z)?1:0);
	}
	
	return 0;
}


查看评论

可持久性数组 bzoj3674 可持久化并查集加强版

传送门:点击打开链接 题意: 强制在线操作,定义3种操作,查询两个点是否在同一集合,合并两个点,把状态恢复到之前的某个状态 思路:利用线段树实现的可持久性数组,其实原理上就是线段树,那么是如何实现...
  • qwb492859377
  • qwb492859377
  • 2016-01-03 19:38:24
  • 1730

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

题目大意:同3673 强制在线 同3673 只不过慢了一些0.0 这道题只写路径压缩比只写启发式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include #inc...
  • PoPoQQQ
  • PoPoQQQ
  • 2014-10-20 18:45:24
  • 1562

bzoj3674: 可持久化并查集加强版

传送门 一点也没加强好不好 主席树+并查集启发式合并,实现nlog^2n的复杂度。 速度快到飞起。#include #include #include #include #include #in...
  • zhouyuyang233
  • zhouyuyang233
  • 2017-04-06 08:14:05
  • 394

[BZOJ 3674]可持久化并查集加强版:可持久化并查集

点击这里查看原题按秩合并,即深度小的根的fa指向深度大的根;如果深度相同,那么随便合并,之后深度+1/* User:Small Language:C++ Problem No.:3674 */ #in...
  • SmallSXJ
  • SmallSXJ
  • 2017-06-10 11:10:25
  • 142

Bzoj 3674: 可持久化并查集加强版

传送门: http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题面: nn 个集合 mm 个操作 操作: 1 a b1\ a\ b 合并 a...
  • MintGreenTZ
  • MintGreenTZ
  • 2017-07-07 19:51:56
  • 225

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

BZOJ - 3674 考虑用可持久化线段树维护 fafa 和 deepdeep 数组。并且按秩合并。 这样复杂度就是 O(nlog2n)O(nlog^2n) 了。代码里没对 deepdeep 数...
  • jinglinxiao
  • jinglinxiao
  • 2017-08-29 00:32:13
  • 172

bzoj 3674 可持久化并查集加强版

传送门:http://hzwer.com/3997.html(题目在里头) 思路:一直想搞这玩意,,,结果呢,,不会做,上网看了一下题解,,用什么可持久化数组?哦,,要用主席树维护一下,,貌似很简单...
  • qq_20669971
  • qq_20669971
  • 2016-03-11 21:41:22
  • 557

【BZOJ】3674: 可持久化并查集加强版

【BZOJ】3674: 可持久化并查集加强版 传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 额……没啥好说的了……做法同上一题……...
  • Pure_W
  • Pure_W
  • 2017-01-19 23:44:20
  • 525

可持久化并查集(三)——从动态到可持久化

其实在上一篇:可持久化并查集(二)——从镜像到动态中已经可以算是一个伪可持久化了,但是对于历史查询等操作无能为力。。所以本篇重点介绍可持久化操作 BZOJ 3673题目连接 这题不知道出题人什么...
  • lemonoil
  • lemonoil
  • 2017-02-26 16:05:38
  • 3775

bzoj3673 可持久化并查集 by zky

Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否...
  • lzr010506
  • lzr010506
  • 2016-03-02 19:33:58
  • 803
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1827
    排名: 2万+
    最新评论