既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa[x]==x 之所以这种写法不能路径压缩,个人理解是因为路径压缩会破坏原先的结构...反正我魔改改错了...先咕着路径压缩qwq 下面是加强版的代码...只有按秩合并 #include<cstdio> #include<iostream> #define R register int…
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛.如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的.现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥.Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k…
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破之. 3:输出判断即可. 难者不会,会者不难,1h前我还在膜这道题,现在吗hhh就当支持下zky学长出的题了. 3673: #include<cstdio> #include<cstring> #include<algorithm> #define read(x) x=ge…
http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作是差不多的,只不过是在线段树上操作.需要注意的是并查集的合并,需要按秩来进行启发式合并. #include<iostream> #include<cstdio> using namespace std; *+; int n,m,tot; ],h[maxn*]; struct node…
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好处理一些. 然后就用可持久化线段树来维护这个可持久化数组,就能做到可持久化并查集,可持久化平衡树,可持久化之类的云云 3673不需要按秩合并,3674需要...用3674就能过俩,双倍经验双倍的幸福! #include<iostream> #include<cstdlib> #incl…
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<=n,m<=2*10^4 Input Output Sample Input 5 6 1 1 2 3 1 2 2 0 3 1 2 2 1 3 1 2 Sample Output…
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^4 Input Output Sample Input 5 6 1 1 2 3 1 2 2 0 3 1 2 2 1 3 1 2 Sample Output 1 0 1 题解: 首先普通并查集操作中,是靠fa这个数组维护的 所以要可持久并查集,就要可持久化fa数组,所以用到可持久…
BZOJ 3673 BZOJ 3674(加强版) 如果每次操作最多只修改一个点的fa[],那么我们可以借助可持久化线段树来O(logn)做到.如果不考虑找fa[]的过程,时空复杂度都是O(logn). 想要这样就不能加路径压缩,否则要对路径上的点都要改,最好时空复杂度是O(log^2n),但是空间会炸. 合并集合时按秩合并,这样暴力找fa[]的复杂度为O(logn). 再加上线段树就是O(log^2n).(当然空间是O(mlogn)) 具体:可持久化线段树每个叶子节点储存其fa[x].每次按秩合…
原题 加强版 题意: 可持久化并查集模板-- 题解: 用可持久化线段树维护一个可持久化数组,来记录每一次操作后的状态. 不能用路径压缩,但是要按置合并,使复杂度保证在O(log) #include<cstdio> #include<algorithm> #define N 200010 #define M 5000010 using namespace std; int n,m,f[N],root[N],cnt,sze[M]; struct hhh { int ls,rs,sum;…
本质上是维护两个可持久化数组,用可持久化线段树维护. /************************************************************** Problem: 3673 User: idy002 Language: C++ Result: Accepted Time:76 ms Memory:13780 kb ****************************************************************/ #include…