
并查集
Masker_43
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【F - True Liars】
思路: 带权并查集(种类) 注意**par[i]和FIND(i)**的区别。 dp+输出路径 注意cur卡了很久 最奇怪的就是maxn的大小,605、1005都会WA,1000、1111则AC。 代码: 63ms 4696kB //63ms 4696kB #include <iostream> #include <algorithm> #include &l...原创 2019-07-02 15:05:00 · 277 阅读 · 0 评论 -
【E - 食物链】
思路: 基础种类并查集,注意取余,+3 。 读到文件尾会 WA,真是 … 。 总结: 逻辑判断类题,当同属于同一集合(头元素相同)时进行判断;不属于同一集合时,合并。 代码: 282ms 1116kB //282ms 1116kB #include <iostream> #include <cstdio> #include <cstring>...原创 2019-06-30 16:56:29 · 512 阅读 · 0 评论 -
【D - How Many Answers Are Wrong】
思路: 带权并查集,区间统计。 带权并查集和普通并查集的区别: Find 函数不可以写递归了,要能够动态更新路径上所有点的 val 。 UNION 函数中要改 val[parr],不需要改val[r]。 本题注意: 题目没说多组用例,自己也要读到文件尾,不然就会WA。 区间统计需要变成左开右闭(如此针对:6,6,1 类限制才不会出错)。 代码: 46ms 2972kB ...原创 2019-06-30 16:16:36 · 123 阅读 · 0 评论 -
【C - How Many Tables】
思路: 非常质朴的并查集啦,求有几个联通块,最后头为 -1 的元素个数就是呗。 代码: 0ms 1416kB //0ms 1416kB #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 1005; in...原创 2019-06-30 14:50:34 · 165 阅读 · 0 评论 -
【N - Is It A Tree?】
思路: 和 //0ms 1200kB #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 1e5 + 5; int T = 0; bool ans; int par[maxn]; bool app[maxn]...原创 2019-07-05 12:25:49 · 162 阅读 · 0 评论 -
【M - 小希的迷宫】
思路: 很容易想到是并查集,若新路的两端已经联通,则成环(不符合要求)。 但是有坑:首先小希要求 “任意两个房间都有且仅有一条路”,即全图是强连通的。若树根有两个或两个以上则不符合要求。 若直接输入 “0 0”,说明迷宫没有房间,符合要求。 注意编号不一定顺序,因此要加入 app[maxn]。 代码: 46ms 1904kB //46ms 1904kB #include <...原创 2019-07-05 11:52:07 · 294 阅读 · 0 评论 -
【B - The Suspects】
思路: 并查集基础题。 首先写了BFS,MLE。 并查集:令第一个元素为首元,将每组合并,最后查找也比较简单。 代码: BFS:MLE #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const i...原创 2019-06-30 10:49:56 · 107 阅读 · 0 评论 -
【L - Connections in Galaxy War】
思路: “带权并查集”(权不变),离线删除、查询 离线:结构体存储。 将顺序的删除改为逆序的增添,起始图为全部摧毁后的图,再逆序输出答案。 还没有AC 代码: WA #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <s...原创 2019-07-05 09:49:59 · 206 阅读 · 0 评论 -
【A - Wireless Network】
暑假啦,做并查集专题~~~~ 思路: 先预处理把距离合格的电脑之间做上标记。 每次修理时可能发生合并。 每次询问时,查看是否在同一组中。 注意: 不加头文件可能会莫名报错。 scanf 注意加 getchar。 代码: 3000ms 1680kB //3000ms 1680kB #include <iostream> #include <cstdio>//...原创 2019-06-29 22:09:57 · 112 阅读 · 0 评论 -
【K - Rochambeau】
思路: 带权并查集+枚举。 关键在题意: 若按照一般做法,当出现矛盾时完全无法判断是关系链上的哪一环导致出错,也就无法确定 judge 的身份。 枚举每一个人,认为此人是 judge 时,有关他的所有关系都是不可信的,需要跳过。 题目不仅要求出谁是 judge,还要求判断多少条关系后能够确认他是 judge,等价于能够判断所有其他人都不是 judge 的语句数量。 所以,EDGE 存边、枚举 ...原创 2019-07-04 19:39:08 · 180 阅读 · 0 评论 -
【J - A Bug's Life】
思路: 基础种类并查集。 注意输出格式 \n\n。 代码: 766ms 708kB //766ms 708kB #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 2005; int N,M; bool ...原创 2019-07-04 15:40:03 · 134 阅读 · 0 评论 -
【I - Navigation Nightmare】
思路: 二维并查集,水平坐标是一维,竖直坐标是另一维,每维都有自己的par & val。 注意一条路同时提供水平和竖直两个维度的新关系。 假设询问时间从小到大,不然若每次都重新并查集会TLE。 代码: 157ms 1940kB //157ms 1940kB #include <iostream> #include <cstring> #include...原创 2019-07-04 15:14:35 · 202 阅读 · 0 评论 -
【H - Parity game】
思路: 种类并查集+离散化 这应该是一种非常简便的离散化方法: 因为数字的范围太大(1e9),不得不离散化,即将 5000*2 个 index 通过映射存起来。 把每个询问存进结构体,数组和队列皆可;把全部的端点 index 存进 f 数组(par 和 val 的 maxn 都是 1e4 + 5)。 对 f :sort 排序,unique 去重,如此,每个端点 index 就有了自己的 “指纹...原创 2019-07-03 11:33:30 · 187 阅读 · 0 评论 -
【G - Supermarket】
思路: 贪心(可加并查集优化) 贪心: 选取方法:先将物品按价值从高到低排序,尽量把出售物品的时间向后放,不要影响前面的物品。 拿最高价物品A来说: 有没有可能不选择这个最高价值的物品呢?如果不选它,那必定是在它的截止日期可以售出更高价的物品,但是它已经是最高价的啦,所以一定要卖它。 有没有可能在之前卖它可以获利更大呢?如果可以,必然是有某个物品B本来不能卖,现在能卖了,可是A和B仍然...原创 2019-07-02 19:30:49 · 242 阅读 · 0 评论 -
并查集
核心: 普通并查集: void INIT(){ memset(par , -1 , sizeof(par)); return ; } int FIND(int i){ return par[i] == -1 ? i : par[i] = FIND(par[i]); } void UNION(int l,int r){ par[parr] = parl; return ; } ...原创 2019-07-05 21:27:58 · 161 阅读 · 0 评论