合集-并查集

摘要:原题链接 题解 树上只有两种颜色,我们把每种颜色的连通块记录下来,只有当路径两端的点属于同一连通块且颜色与朋友喜欢的不同时输出0 code #include<bits/stdc++.h> using namespace std; char s[100005]; int fa[100005]; int 阅读全文
posted @ 2024-04-02 19:37 纯粹的 阅读(50) 评论(0) 推荐(0)
摘要:原题链接 题解 把这里的数字看成间隔,不要看成点 假设已知能和 \(l\) 组成区间的端点集合 \(A\) 和以 \(r\) 组成区间的端点集合 \(B\),这时候加入一个以 \(l,r\) 为左右端点的区间,那么在加入区间 \(l,r\) 之后,这两个集合可以合并 code #include<bi 阅读全文
posted @ 2024-06-03 13:05 纯粹的 阅读(47) 评论(0) 推荐(0)
摘要:原题链接 题解 1.集合+搜索 2.把数字看成间隔而不是点 3.类似于差分约束,这里的建边意味着相对大小,根据传递性可知,如果ab建边,bc建边,那么ac之间的关系也能确定,可以用搜索维护 所以unknown代表两个点没有之间或者间接的边相连,可以用集合维护 code #include<bits/s 阅读全文
posted @ 2024-06-03 14:53 纯粹的 阅读(49) 评论(0) 推荐(0)
摘要:原题链接 题解 给定若干条路径限制,问是否合法 对于树上任意三个点 \(a,b,c\) (不一定直接相连),如果已知 \(a\oplus b,b\oplus c\) 那么 \(a\oplus c\) 也已知 所以我们可以对限制里相连的节点放到一个集合里,并且统一记录他们到集合头领的路径异或值 由于奇 阅读全文
posted @ 2024-07-16 11:15 纯粹的 阅读(50) 评论(0) 推荐(0)
摘要:原题链接 题解 先看成前缀和,这样就是维护 \(pre[r],pre[l-1]\) 两点之间的权值 如果是false,代表存在矛盾,且矛盾出现在回路 我们可以把这个回路之前的元素看成一个集合,如果新加入的边使得原先两点间的权值不等便失效 而对于一个集合里的元素,由于相加具有矢量特性,所以我们维护集合 阅读全文
posted @ 2024-07-23 20:37 纯粹的 阅读(37) 评论(0) 推荐(0)
摘要:原题链接 题解 关系具有矢量特性,因此可以带权并查集维护 code #include<bits/stdc++.h> #define ll long long using namespace std; int fa[50006]; int val[50006]; int finds(int now) 阅读全文
posted @ 2024-07-27 16:23 纯粹的 阅读(58) 评论(0) 推荐(0)
摘要:原题链接 题解 朴素做法: 每次询问,二分最小边,然后bfs遍历查看是否能到达,时间复杂度 \(O(q\cdot logn\cdot m )\) 优化: 如果答案里的最小边是 \(k\) ,那么代表所有边权不小于 \(k\) 的边都可以使用,因此可以直接从大到小加入边,直至起点与终点连接 时间复杂度 阅读全文
posted @ 2024-07-31 14:02 纯粹的 阅读(72) 评论(0) 推荐(0)