随笔分类 -  ACM / 并查集

摘要:原题链接 考察:并查集 并查集维护序列的连通性 Y总在课上提过的题目,本蒟蒻果然不会 思路: 本质是快速染色某个区间.并查集可以帮助我们快速找到第一个未染色的点. 设p[i]为以i为起点第一个需要还未涂色的点(包括i) .通过findf(i)可以帮助我们找到第一个未染色的点.我们在for循环染色[l 阅读全文
posted @ 2021-05-13 21:45 acmloser 阅读(49) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集+离线 和这题有点像的题 HDU 3938 (本蒟蒻甚至写过) 思路: 乍一看似乎是LCA,但是询问两点最短距离必定TLE.我们可以发现两点之间的最短边首先是原题给定一条边,然后再对该边进行延伸.假定当前给定值是k,我们枚举边,将边两端进行合并,这样就是符合条件的结点个数.当k 阅读全文
posted @ 2021-05-13 16:56 acmloser 阅读(77) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集 思路: 很容易想到用并查集的根节点代表此集合的权值和.但是注意在结点合并的时候,会出现本不属于这里的权值.被路径压缩加到子结点上. 这里有两种处理方式: 一、建立虚点. 在x,y之上建立一个结点s,在路径压缩时就不会合并到y集合的权值k. 二、特殊处理x结点权值,在x权值和上 阅读全文
posted @ 2021-04-16 13:01 acmloser 阅读(51) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:二分+二分图判定 or 带权并查集+贪心 思路一: 二分+二分图判定.由题目可知我们要求最大矛盾的最小值.最小值可以通过二分枚举,那么关键是如何check.首先容易想到>最小值的两个人一定不能在同一集合.需要将它们分别放在不同的监狱.那么问题来了:这样存放可能会导致某些破坏最小值合法 阅读全文
posted @ 2021-04-12 01:30 acmloser 阅读(106) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集+邻接表+逆向思维 kuangbin题单有这道题,但那道题本蒟蒻只看了思路,没有实现,今天做了一下才发现没有那么简单..... 错误思路: 离线处理,将所有的要连的边先存储,标记要摧毁的点,将还未摧毁的点先连接.再将存储的摧毁的点从尾到头遍历,边涉及本次修复的点的就连接, 结果 阅读全文
posted @ 2021-01-21 21:36 acmloser 阅读(72) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集 看了大佬的代码后才懂.本蒟蒻属实好菜.. 正确思路: 考点就是并查集删除点的操作.如果每个点的父亲赋原值,那么findf函数后修改某一非叶子结点,后面的结点也会被修改为修改后的值.因此此法无效 正确做法是设置虚父结点.i的父亲是i+n,但初始化的时候和一般并查集有点不一样.在 阅读全文
posted @ 2021-01-15 00:45 acmloser 阅读(79) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:最小生成树+并查集的运用+离线处理 永远不会动脑思考TAT 看大佬来的思路: 这道题的询问量很大.因此可以采取一些技巧.我们可以发现L大的答案是可以由L小的答案累加得来的.因此这道题对询问进行排序.先处理L小的询问.再进行累加推导L大的询问. 当i,j有多种路径,我们是选择一条经过路 阅读全文
posted @ 2021-01-14 16:41 acmloser 阅读(99) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:基础并查集 思路: 已经在集合的不能在连边 易错: 注意所有房间都要连通.所以最后正确的图是一张最小生成树 1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <set> 5 usin 阅读全文
posted @ 2021-01-13 08:56 acmloser 阅读(61) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集+拓扑序列+离线处理 难点在于并查集如何运用,我是卡在如何判断条件不足那里卡了很久.拓扑序列处理不了等号问题.如果用队列中无根结点的元素>2来判断条件不足的话,也存在相等利用序号大小排列名次的问题.因此这题就没写出来... 错误思路1: 利用并查集判矛盾,利用拓扑序列判断是否无 阅读全文
posted @ 2021-01-11 14:42 acmloser 阅读(62) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集+枚举 错误思路: 接收了所有的判断语句,当出现矛盾的时候玩游戏的两人犯规次数+1,输出犯规最多的人. 很明显错在有裁判的关系是不准确的,因为那段关系不能考虑 正确思路: 枚举每个可能为裁判的人,如果可能为裁判的人>1,则不能确定;如果=1,则输出此人.如果==0,则impos 阅读全文
posted @ 2021-01-05 01:54 acmloser 阅读(64) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察: 带权并查集 思路: 设置东西方向和南北方向两个数组,其他就和之前的题目一样,但是要注意我们压缩路径的时候要把东西和南北距离都压缩 1 #include <iostream> 2 using namespace std; 3 const int N = 40010; 4 int p[ 阅读全文
posted @ 2021-01-04 19:42 acmloser 阅读(55) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察: 带权并查集 做了银河英雄传说和奇偶游戏后这题应该算简单了,没加入集合的加入集合,已入集合的检验就行了 1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 using namespace std; 5 阅读全文
posted @ 2021-01-04 09:34 acmloser 阅读(84) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集+位运算+前缀和思想+离散化 如果没想到前缀和这题完全没得思路,看了lyd大佬的提示,配合自己画图把这题做出来了= = 思路: 要AC本题我们需要前缀和思想,如果一个区间内1的个数为even,那么我们可以发现sum[r]-sum[l-1] = 偶,根据奇偶规律,我们可知这两个奇 阅读全文
posted @ 2021-01-04 01:21 acmloser 阅读(211) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集+贪心或堆排序+贪心 因为最近在做并查集专题所以直接考虑用并查集写,但是看题目完全没有想到用并查集的方式,以前写的并查集题目关系的传递性都很明显,但是这道题本蒟蒻完全没看出来 思路: 用并查集维护天数,贪心策略是能多晚卖出就多晚卖出,起初每个天数都在它自己的集合里,当我们决定要 阅读全文
posted @ 2021-01-03 22:04 acmloser 阅读(79) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察: 并查集+离散化 错误思路1: 在线处理,每次收到新的命令就判断对错,不知道在线处理能不能行,但是在线有个麻烦的点是要判断这个数字是否在alls里面出现过,如果出现过判断多错,没有就是要新加入关系.并且在线处理还需要标记哪些变量不能相等 错误思路2: 将1~N的数字全部赋值p[i] 阅读全文
posted @ 2021-01-03 20:20 acmloser 阅读(87) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察: 并查集 通过这道题算是把食物链没搞懂的问题又弄明白了点 很明显根据题意我们需要维护一个距离数组,表示父节点到子节点的距离. 当操作是C的时候,我们实际上在进行C操作之前是进行过路径压缩的,因此d[x]的距离变成了x到根节点的距离,d[y]的距离就算y到根节点的距离,因此两者的距离差 阅读全文
posted @ 2021-01-03 14:39 acmloser 阅读(91) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集的基本应用 想到了再建一个敌人数组,但没想到怎么操作...菜是原罪 正确思路: 如果是朋友,我们直接并入一个集合 如果是敌人,我们需要建立一个N叉树,分支是敌人数组的下标,里面的值是根,比如e[5] = 1,表示根为1,分支为5的树,n次操作后,我们会形成一个n叉树,此时我们需 阅读全文
posted @ 2021-01-03 12:27 acmloser 阅读(109) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察: 并查集基础 和前面suspects差不多的题目,就是将计算集合内人数换成计算集合个数,用数组标记集合的编号即可 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace st 阅读全文
posted @ 2021-01-03 10:45 acmloser 阅读(123) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集基础 在读入学生团体的时候,没必要用数组存储,直接将他们并入树中即可,注意:当我们计算人数的时候,已经在一个集合中的人不能重复计算 当时看y总犯了这个错误,结果自己写又错了233 1 #include <iostream> 2 #include <cstdio> 3 using 阅读全文
posted @ 2021-01-03 10:14 acmloser 阅读(55) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:并查集基础 思路: 只有维修后的电脑才是有用的,因此我们用数组来标记维修后的电脑,当它们能连通需要以下条件: x电脑和y电脑都是维修后的 x电脑与y电脑距离的平方小于d*d 如果距离大于d*d,那么它们之间存在中介点,且中介点也被维修过 1 #include <iostream> 2 阅读全文
posted @ 2021-01-03 09:15 acmloser 阅读(82) 评论(0) 推荐(0) 编辑