题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 洛谷P3402:https://www.luogu.org/problemnew/show/P3402 可持久化并查集!就是用主席树模拟并查集,真美! 路径压缩版:和并查集的相似之处想想感觉好妙: 但复杂度似乎有点不科学,bzoj 的两道题都…
n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 说是可持久化并查集,实际上是把并查集的所有find和merge操作都放到可持久化数组上做,这样可以做到完全可持久化(不仅能查询某个历史版本,而且还能在某个历史版本的基础上进行修改) 注意并查集要按秩合并 可持久化数组可以用可持久化线段树(主席树)或者可持久化平衡树实现,理论上平衡树应该更快一些而且更省内存(但也省不了多少) 线…
https://www.lydsy.com/JudgeOnline/problem.php?id=3673 https://www.lydsy.com/JudgeOnline/problem.php?id=3674 https://www.luogu.org/problemnew/show/P3402 这里最强的应该是BZOJ3674,于是接下来讲的内容和代码与BZOJ3674相同而非另外两道题,但核心思维完全一致. n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次…
点开这题纯属无聊……不过既然写掉了,那就丢一个模板好了 不得不说,可持久化并查集实现真的很暴力,就是把并查集的数组弄一个主席树可持久化. 有一点要注意的是不能写路径压缩,这样跳版本的时候会错,所以弄一个按秩合并来降低时间复杂度. 总时间复杂度$O(nlog^2n)$. 听说用siz实现按秩合并会比较好,因为这样还能查询集合大小,有时间以后补上. Code: #include <cstdio> using namespace std; ; ; int n, qn; inline void rea…
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要连的区间已经有一部分连成这个样子了,就希望跳过这一段. 想倍增那样跳过已经连好的部分.用并查集实现. 建 logn 个并查集,第 i 个并查集里 x 和 y 连通表示 \( [x,x+2^i-1] \) 和 \( [y,y+2^i-1] \) 已经连成了的样子. 那么要连 \( [l1,r1] \)…
正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ 所以就做了下QwQ 这题,大概难点在分类讨论?(划 反正整个儿就并查集板子题了 说难点在分类讨论主要是因为,一般这种都是分成两组嘛,就很简单fa[x]=y fa[x+n]=y+n差不多这意思嘛 但是这个是分成三组,,,所以打起来就要注意一下理清条理,最好注释下什么东西是干什么的,这样打起来其实还是…
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或间接地连接. 但好景不长,很快帝国又重新造出了他的超级武器.凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球.由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来. 现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击…
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1551 思路: 很显然地我们会发现,这是一道并查集的模板题,并且是考察了并查集中的”并“和”查“的操作(好像所有关于亲戚的题都与并查集有关... 然后就是一个并查集的模板了,可以尝试记住(亏自己先会了最小生成树... AC代码: #include<cstdio> #include<iostream> using namespace std; ]; int a, b, c, d; in…
看了他们的题解感觉很震惊,为什么要用kruskal,这题要用到最小生成树吗??? 38行短短的程序就可以了,我觉得学习不是一种套用,套自己学的,而且题解很大一部分都是kruskal. 个人认为自己的程序比他们快. #include<bits/stdc++.h> using namespace std; struct node{ int x,y,z; }q[]; ],num[]; int n,m; bool f; int w_comp(const node a,const node b){ re…
题目:https://www.luogu.org/problemnew/show/P1525 并查集+贪心,从大到小排序,将二人分在不同房间,找到第一个不满足的即为答案. 代码如下: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,m,fa[20005],ans,ct,d[20005]; struct N{ int hd,to,w; }edge[1000…
https://www.luogu.org/problemnew/show/P5429 很明显是要维护整个连通块的共同性质,并查集一搞就完事了. #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=100000; int par[MAXN+5]; int u[MAXN+5],d[MAXN+5],l[MAXN+5],r[MAXN+5]; void init(int n) { for(i…
https://www.luogu.org/problemnew/show/P4997 首先是改变气的定义,使得容易计算,这个很好理解. 然后使用并查集,因为要维护整个连通块的性质. 最后的难点在于,落子把同颜色的连通块连接了,但假如本身就是同一个连通块则不应该计数,所以其实连通块的气不应该手动维护,而应该全权交给并查集去处理. 当然去重之后也是对的. #include<bits/stdc++.h> using namespace std; typedef unsigned long long…
https://www.luogu.org/problemnew/solution/P1111 并查集的水题,水题都错了好多发. 首先并不是有环就退出,而是连通分支为1才退出,每次合并成功连通分支才会减1. 还有一个bug就是假如没有到达连通分支为1,不应该输出maxt而是要输出-1.所以应该是在cnt==1的情况再更新maxt并break才对. #include<bits/stdc++.h> using namespace std; #define ll long long int n,m;…
题目:https://www.luogu.org/problemnew/show/P1197 题意:有n个结点m条无向边,k次操作每次摧毁一个结点并询问此时有多少连通块. 思路:平时在线的搞多了都没想到这道题完全可以存下结果之后输出. 对于那些要被摧毁的城市,我们只需要先都摧毁,然后倒序的进行恢复.就可以求出每一次操作的结果了. 因为对于摧毁我们不好用并查集,但是对于重建就比较好用并查集了. 所以分成两步,把所有没有被摧毁的连通的结点都合并起来. 然后按照倒序加入被摧毁的结点,将他和他所邻接的结…
给一手链接 https://www.luogu.com.cn/problem/P2661 这道题就是 并查集求最小环 TIPS:压缩路径的时候d[x]=d[fa[x]]+d[x],而不是d[x]=d[fa[x]]+1 因为路径是压缩过的 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> using namespace std…
先上一波链接qwq https://www.luogu.org/problem/P1111 这题就是裸的并查集咯qwq 维护一下连通块的数目 数目变为一的时候整个图就连通了 输出此时的答案就okay拉 #include<cstdio> #include<cstring> #include<algorithm> ; using namespace std; int read(){ ,f=,c=getchar(); ; c=getchar();} +(c-'); c=get…
先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 问题便完美解决了qwq #include<cstdio> #include<cstring> #include<algorithm> ; using namespace std; int read(){ ,f=,c=getchar(); ; c=getchar();} +…
链接 https://www.luogu.org/problemnew/show/P1551 代码 #include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=1e5; int par[maxn]; int rank1[maxn]; void f(int n) //初始化 { ;i<n;i++) { par[i]=i; rank1[i]=; } } int find(int x) { i…
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以使合并均摊复杂度为O(nlog2n).可持久化线段树实际上就是在更新节点时按主席树的插入方式新建一条路径(其实主席树就是可持久化权值线段树). 代码: #include <cstdio> #include <cstring> #include <algorithm> #de…
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc++.h> #define ll long long #define N 20005 using namespace std; inline int read(){ ,f=;char ch=getchar(); ;ch=getchar();} *x+ch-';ch=getchar();} return…
闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集Debug到13:20过了前4个样例,然后第5个T飞了. FST? ...... FST! 完美收获50分暴力分. 原来是按秩合并那里咕咕了. 从50到100的蜕变,只需一行,你值的拥有. 思路 不会kruscal重构树 容易发现,假设我们确定了水位线,那么就确定了图中有哪些边是连通的.这时候的答案该…
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时候感觉掌握的并不熟,还是需要参照别人的题解,不过至少现在对可持久化的理解更深了一步,而且终于这题给调对了. Code: //It is made by HolseLee on 23rd Aug 2018 //Luogu.org 4768 #include<cstdio> #include<c…
题目传送门 可持久化并查集 n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 5 6 1 1 2 3 1 2 2 0 3 1 2 2 1 3 1 2 输出样例#1: 1 0 1 说明 $1 \le n \le 10^5, 1 \le m \le 2 \times 10^5$ By zky 出题人大神犇 分析:…
题目链接 可持久化并查集,就是用可持久化线段树维护每个版本每个节点的父亲,这样显然是不能路径压缩的,否则我们需要恢复太多状态. 但是这并不影响我们启发式合并,于是,每次把深度小的连通块向深度大的上并就好了. #include <cstdio> #define re register inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-')w…
BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2∗104" role="presentation" style="position: relative;">0<n,m<=2∗1040<n,m<=2∗104…
[BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:……n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x = x xor lastans,…
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1329957 题目链接地址: 洛谷P1484 种树 洛谷P3620 [APIO/CTSC 2007]数据备份(各大oj多倍经验) 照例吐槽 两道基本一模一样的题,只是第二道要差分顺便思维稍微向这边转化一下... 我觉得这两个题思维很不错啊!很\(Noip\ T2\)的样子... 话不多说将题解 贪心+堆优化 肯…
好久之前就想学了 然后今天恰巧一道题需要用到就学了 前置芝士 1.主席树[可持久化数组] 2.并查集 如果你掌握了前面两个那么这个东西你就会觉得非常沙茶.. 构造 可持久化并查集 = 主席树  + 并查集 有点蠢= = 当然 我们这里的并查集是要按秩合并的并查集 [按秩合并:就是把dep小的连接到大的上面 这个复杂度分析出来是O(lgn)的 原因不要问我 我不知道= =] 不可以路径压缩 原因好像是可以被极限数据卡掉?[我也不知道路径压缩了你怎么访问历史版本的emm..] 这样的话 我们每次开l…
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 Sample Output Solution 用rope实现可持久化数组,用rope的历史记录功能实现可持久化并查集,通过时间168ms #include<cstdio> #include<ext/rop…
3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status][Discuss] 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…