3673: 可持久化并查集 by zky Description n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^4 n个集合 m个操作操作:1 a b 合并a ...
分类:
其他好文 时间:
2016-12-14 21:15:45
阅读次数:
370
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 (题目链接) 题意 维护并查集3个操作:合并;回到完成第k个操作后的状态;查询。 Solution 其实就是用主席树的叶子节点维护并查集的可持久化数组fa[]。 细节 终于认识到了按秩合并的强大 ...
分类:
其他好文 时间:
2016-11-06 22:58:02
阅读次数:
440
线段树只用叶子节点感觉莫名浪费,,, 感觉真好写(刚从未来程序逃回来的人) ...
分类:
编程语言 时间:
2016-10-20 22:07:56
阅读次数:
217
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集。 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以使合并均摊复杂度为O(nlog2n)。可持久化线段树实际上就是在更新节点时按主席树的插入方式新建一条 ...
分类:
其他好文 时间:
2016-07-24 17:48:26
阅读次数:
242
主席树。 我分不清主席树和可持久化线段树。。 用主席树记录历史版本。 然后每个节点保存一个深度,代表以自己为根的树的深度。 合并时将深度小的树合进深度大的树。 3673也是一样的,不过那道题不强制在线。 #include #include #include using namespace std; ... ...
分类:
其他好文 时间:
2016-07-12 17:11:18
阅读次数:
134
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩。 2:直接把跟的值指向root[k]的值破之。 3:输出判断即可。 难者不会,会者不难,1h前我还在膜这道题,现在吗hhh就当支持下zky学长
分类:
其他好文 时间:
2016-02-27 22:13:18
阅读次数:
179
分析(引入Q神题解 %%%Q) 如果使用可持久化并查集,二分答案判定连通性,复杂度是O(mlog3n),不能在时限内出解。考虑到并查集实际上是一棵树,可以尝试在边上维护一些信息,假设t时刻加了一条边(u,v),若u和v此时未连通,则在root(u)和root(v)之间连一条权值为t的边,表示u所在集
分类:
其他好文 时间:
2016-02-09 12:02:43
阅读次数:
291
用可持久化线段树维护可持久化并查集。 调了一下午,改为按秩合并就过了。。。 #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using name
分类:
其他好文 时间:
2016-02-05 00:58:07
阅读次数:
226
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674用可持久化线段树维护可持久化数组,加上启发式合并,就成了可持久化并查集。。用root数组来记录当前是第x次操作之后的情景,这样我们就可以返回某次操作之后了。注意一直都是维护点的pos,画个图...
分类:
其他好文 时间:
2015-12-23 15:48:11
阅读次数:
207