返回顶部

随笔分类 -  并查集dsu

摘要:离线将所有信息存下来,按照字符的大小排序,不难发现,字符ascii越大的最后覆盖最优,那么我们选最大的覆盖,同时并查集维护覆盖过的区间,即让每个节点的父亲都等于它右边的节点,对于每个区间我们跑$[l_i,r_i]$,每次更新$l$为$p[l+1]$,这样遇到覆盖过的区间就直接跳过,那么复杂度为$O( 阅读全文
posted @ 2021-11-13 19:55 _Kolibri 阅读(94) 评论(0) 推荐(0)
摘要:题意:两条垂直边之间有$n$个点,问点的半径至少为多少可以将两条边完全封死。 题解:首先对半径进行二分,然后分别统计能到达左边和右边的点,将相交的点用并查集合并起来,然后判断能到达左边的点和右边的点是否在同一个集合即可。 代码: #include <bits/stdc++.h> #define ll 阅读全文
posted @ 2021-10-10 11:57 _Kolibri 阅读(49) 评论(0) 推荐(0)
摘要:题意:有一张$n$个点,$m$条边的无向图,每条边都有边权,$q$个询问,每次问一个$q_i$,将所有边权减去$p_i$后不小于$0$的边为有效边,问有多少对点能相互到达。 题解:一张图,两个点连通,不难想到最小生成树,进而想到保留边权最大的边最优,即转化成了最大生成树,那么我们就可以将询问离线存下 阅读全文
posted @ 2021-09-04 19:38 _Kolibri 阅读(132) 评论(0) 推荐(0)
摘要:题意:给你一张图,要你去边,使其成为一个边数为$n-1$的树,同时要求树的最小边权最大,如果最小边权最大的情况有多种,那么要求总边权最小.求生成树后的所有简单路径上的最小边权和. 题解:刚开始想写最大生成树的,但是很明显不能满足总边权最小的要求.所以这里我们可以用二分,二分最小边权的值,然后再去跑k 阅读全文
posted @ 2020-12-26 17:10 _Kolibri 阅读(211) 评论(0) 推荐(0)
摘要:题意:给你带边权的树,有$m$次询问,每次询问有多少点对$(u,v)$之间简单路径上的最大边权不超过$q_i$. 题解:真的想不到用最小生成树来写啊.... 我们对边权排序,然后再对询问的$q_i$排序,我们可以枚举$q_i$,然后从last开始遍历边权,如果边权不大于$q_i$,那么就可以用并查集 阅读全文
posted @ 2020-11-27 09:58 _Kolibri 阅读(81) 评论(0) 推荐(0)
摘要:题意:有$n$个点,对这些点进行$m$次染色,第$i$次染色会把区间$(ip+q)\ mod\ N+1$和$(iq+p)\ mod\ N+1$之间的点染成颜色$i$,问最后这$n$个点的颜色. 题解:我们可以反着从第$m$次开始染,因为后面的会把前面点的颜色覆盖,所以倒着来的话,下一次染的时候就可以 阅读全文
posted @ 2020-11-13 09:19 _Kolibri 阅读(92) 评论(0) 推荐(0)
摘要:题意:有$n$个罪犯,$m$对罪犯之间有仇,现在将这些罪犯分到两个监狱里去,问两个监狱里有仇罪犯之间的最大权值最小为多少. 题解:先按边权从大到小排序,然后贪心,边权大的两个罪犯,我们一定要先让他们两人分到不同的监狱中,这里我们就可以用并查集来维护, 用种类并查集每次维护两个罪犯的关系,如果他们不在 阅读全文
posted @ 2020-11-13 01:34 _Kolibri 阅读(92) 评论(0) 推荐(0)
摘要:题意:你和朋友玩游戏,有个一$01$序列,你每次给出一个区间,朋友会回答这个区间中的$1$的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题解:假如区间$[l,r]$所含的奇数个数为偶数的话,那么其前缀和$s_$和$s_r$所含的$1$的个数一定同 阅读全文
posted @ 2020-11-13 01:03 _Kolibri 阅读(116) 评论(0) 推荐(0)
摘要:题意:有$n$列,有$T$条指令,若指令格式为$M$,则将第$i$号的所有战舰移到第$j$号所在列的后面,若指令格式为$C$,询问$i$和$j$是否在同一列,如果在,问他们之间隔了多少战舰. 题解:带权并查集的模板题,$d$数组表示某个节点到祖先的距离,$s$数组表示集合的子节点个数,当进行合并时, 阅读全文
posted @ 2020-11-13 00:36 _Kolibri 阅读(85) 评论(0) 推荐(0)
摘要:题意:有$n$个点,$n-1$条边,每个点的类型是$0$或$1$,现在让你选一个点,然后所有与该点类型不同的点直接消失,问选哪些点之后,该点所在的联通块最大. 题解: 因为选完之后两个类型不同的点之间的边会消失,所以我们可以直接维护一个并查集,每个集合中存的是相同类型的点的连通数量,维护最大值即可. 阅读全文
posted @ 2020-09-24 20:41 _Kolibri 阅读(79) 评论(0) 推荐(0)
摘要:题意:有$n$个人,给你$m$对朋友关系,朋友的朋友也是朋友,现在你想要将他们拆散放到不同的集合中,且每个集合中的人没有任何一对朋友关系,问最少需要多少集合. 题解:首先用并查集将朋友关系维护到集合中,然后贪心,其实我们所需要的集合数就是之前并查集维护的集合中的最大元素个数. 代码: int n,m 阅读全文
posted @ 2020-09-02 09:49 _Kolibri 阅读(211) 评论(0) 推荐(0)
摘要:题意:有一个矩形,有$k$个警报器,警报器所在半径$r$内不能走,问是否能从左上角走到右下角. 题解:用并查集将所有相交的圆合并,那么不能走的情况如下图所示 所以最后查询判断一下即可. 代码: #include <iostream> #include <cstdio> #include <cstri 阅读全文
posted @ 2020-06-22 14:03 _Kolibri 阅读(299) 评论(0) 推荐(0)
摘要:题意:给你n个数,有m次操作,每次使得两个数相连接,询问q次,问某两个数是否连接在一起. 题解:这其实是一道并查集的裸题,这里就不再多说了,写个路径压缩的find函数即可. 代码: #include <iostream> #include <cstdio> #include <cstring> #i 阅读全文
posted @ 2020-05-05 13:22 _Kolibri 阅读(310) 评论(0) 推荐(0)