并查集
seez
njfu
展开
-
239.奇偶游戏(拓展域,带边权)
思路:由区间和想到前缀和思想--》离散化--》由于传递性+无向图,想到并查集 分析:s表示前缀和数组,S表示序列 每次检查区间中有偶数个1还是奇数个1的时候,我们可以发现 S[l~r]有奇数个1,等价于s[r]-s[l-1]有奇数个1,等价于s[r]与s[l-1]奇偶性相异 S[l~r]有偶数个1,等价于s[r]-s[l-1]有奇数个1,等价于s[r]与s[l-1]奇偶性相同 那么,我们就可以得出并查集的关系,因为具有传递性,使用带边权的并查集可以表示两个点之间的关系,通过不断地加入新的点到并查..原创 2022-02-08 20:52:42 · 2588 阅读 · 0 评论 -
238. 银河英雄传说(并查集,扩展域)
238. 银河英雄传说 - AcWing题库 分析: 由于要求i,j战舰之间的距离,我们就应该想到拓展域 拓展域要实现: 能够计算第i艘战舰到第j艘战舰距离 我们可以用一个拓展域来存储战舰到根节点的距离,然后还需要考虑怎么合并拓展域 根据食物链的思想,可以维护,注意根结点到根结点距离为0,避免重复计算 int find(int x) { if (x != p[x]) { int u = find(p[x]); d[x] += d[..原创 2022-02-07 20:39:38 · 162 阅读 · 0 评论 -
237 程序自动分析(并查集,离散化)
237. 程序自动分析 - AcWing题库 题意:给定t个问题,每个问题给出一堆约束条件,分析是否正确 约束条件错误的情况:原本相等的两个数又不相等,自相矛盾 分析:要判断一个问题的答案,应该把所有相等的约束条件都放到一个集合里面,每个集合内所有数都相等,判断时,取出不等的约束条件,如果两个数之前在一个集合里面,那么必然是错误的了 所以,应该事先处理合并完所有集合再去判断,而不是边判断边合并集合,不然会出错 #include <iostream> #include <a...原创 2022-02-07 19:28:12 · 82 阅读 · 0 评论 -
1252. 搭配购买(并查集,特殊依赖01背包)
分析:可以看成是特殊的有依赖的背包问题,因为有依赖的背包对于子树是可选可不选,这里是必选全部选,反而变得更加简单了 所以我们可以把一堆搭配看成一个集合,然后运用并查集维护并查集的拓展域,做01背包问题 并查集拓展域 价格域 v ==集合中所有价值和 价值域 w ==集合中所有价格和 #include <iostream> #include <algorithm> using namespace std; const int N=10010; int v[N]; ...原创 2022-02-07 18:16:49 · 361 阅读 · 0 评论 -
1250. 格子游戏
分析:二维转一维,我们发现,每次连边,两个结点可以看为在一个集合中,如果封闭了,就说明两个连边的结点已经再一个集合中了,由于是二维的,可以转换为二维 xx=x*n+y #include <iostream> #include <algorithm> using namespace std; const int N = 200 + 10; int p[N * N]; int line[N * N]; int find(int x) { if (p[x]...原创 2022-02-07 17:53:18 · 1603 阅读 · 0 评论 -
牛客寒假训练营 2 B(差分,并查集)
题意:有n个点,m条边,每次可以把m条边里面选一个放进入图中,然后每次可以使极大联通子图的权重+1,求最少权重+1的操作次数 分析: 由于min(5*n,m),那么所有边一定能够放进入图中,限制条件没有用 限制条件: 每次只能同时操作一个集合内的点 最后的所有需求都要减少为0 由于每次只能同时操作一个集合内的点,那么可以想到并查集的思想,用并查集维护 100. 增减序列(差分+贪心)_qq12323qweeqwe的博客-CSDN博客 并查集扩展域:值域,维护一个集合共同的值 由增减序列的..原创 2022-02-06 21:24:05 · 492 阅读 · 0 评论 -
牛客训练营 2 F 小沙的算数(并查集,逆元)
分析:由于只有正整数,不会出现负数,我们发现只需要储存’*‘的结果,然后和所有’ +‘的结果加起来,就是最后的答案了 所以,’*'连起来的就是一个集合,只需要储存他们的积,我们用并查集连接起来 需要改变集合的值时,找到积和当前要改变的位置的逆元,就能够做到改变积的作用 #include <iostream> #include <algorithm> using namespace std; const int N = 1e6 + 10; const int mod = 1..原创 2022-02-06 17:37:00 · 213 阅读 · 0 评论 -
240.食物链 (并查集扩展域,带权拆点)
题意:只有三种动物,三种动物食物链关系如图 带权并查集 因为只有三种动物,他们和根结点的关系可以用距离来表示 设两个动物a,b ,可以根据他们差值模3的结果得出他们的关系 (a-b)%3==0 同类 (a-b)%3==1 b吃a (a-b)%3==2 a吃b 那么可以得出,我们只要知道两个点之间的距离,就能推断出他们的关系,所以这样就可以用并查集的路径压缩,然后通过新开一个数组记录距离,就能推断...原创 2022-02-05 22:41:49 · 475 阅读 · 0 评论 -
并查集模板
并查集 功能: 将两个集合合并 询问两个元素是否在一个集合当中 查询的时间复杂度近乎O(1)基本原理: 每个集合用一棵树来表示。树根的编号就是整个集合的编号。每个节点储存它的父节点,p[x]表示x的父节点。 问题1:如何判断树根:if(p[x] == x) 问题2:如何求x的集合编号:while(p[x] != x) x = p[x];(常用优化方法:路径压缩) 问题3:如何合并两个集合:...原创 2022-02-05 17:13:15 · 167 阅读 · 0 评论