关闭

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

52人阅读 评论(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;
}


0
0
查看评论

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

传送门:点击打开链接 题意: 强制在线操作,定义3种操作,查询两个点是否在同一集合,合并两个点,把状态恢复到之前的某个状态 思路:利用线段树实现的可持久性数组,其实原理上就是线段树,那么是如何实现可持久性数组的呢。 对于某次修改,就再造一颗线段树,但是这样明显效率和空间都会爆炸。 因为我们其...
  • qwb492859377
  • qwb492859377
  • 2016-01-03 19:38
  • 1681

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

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

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

点击这里查看原题按秩合并,即深度小的根的fa指向深度大的根;如果深度相同,那么随便合并,之后深度+1/* User:Small Language:C++ Problem No.:3674 */ #include<bits/stdc++.h> #define ll long long #d...
  • SmallSXJ
  • SmallSXJ
  • 2017-06-10 11:10
  • 131

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

BZOJ - 3674 考虑用可持久化线段树维护 fafa 和 deepdeep 数组。并且按秩合并。 这样复杂度就是 O(nlog2n)O(nlog^2n) 了。代码里没对 deepdeep 数组持久化。。。不过好像没什么影响。#include<bits/stdc++.h> usi...
  • jinglinxiao
  • jinglinxiao
  • 2017-08-29 00:32
  • 142

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

传送门: http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题面: nn 个集合 mm 个操作 操作: 1 a b1\ a\ b 合并 a,ba,b 所在集合 2 k2\ k 回到第 kk 次操作之后的状态...
  • MintGreenTZ
  • MintGreenTZ
  • 2017-07-07 19:51
  • 209

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

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

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

传送门:http://hzwer.com/3997.html(题目在里头) 思路:一直想搞这玩意,,,结果呢,,不会做,上网看了一下题解,,用什么可持久化数组?哦,,要用主席树维护一下,,貌似很简单啊,,自己YY一下写一发代码,,WA,,查错无果,,对拍无果,,最后不得已看了hzw题解什么数组开小...
  • qq_20669971
  • qq_20669971
  • 2016-03-11 21:41
  • 552

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

题意n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x = x xor lastans,lastans的...
  • qq_33229466
  • qq_33229466
  • 2016-12-21 17:20
  • 383

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

和BZOJ 3673一样。可以翻前一篇文章。 不过内存问题省去了按大小合并。 #include #include #include using namespace std; const int M = 200001; class PersistantArray { struct Nod...
  • huanghongxun
  • huanghongxun
  • 2015-12-30 21:51
  • 435

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

主席数维护可持久化数组实现可持久化并查集思考时主要考虑并查集的变化与特性,没有考虑其易于处理的本质体现以及手中的工具………
  • limboman
  • limboman
  • 2016-10-22 21:18
  • 108
    -广告-
    一个极其温馨的提示
    个人资料
    • 访问:48714次
    • 积分:1745
    • 等级:
    • 排名:千里之外
    • 原创:127篇
    • 转载:1篇
    • 译文:0篇
    • 评论:23条
    最新评论