并查集
酷酷的Herio
这个作者很懒,什么都没留下…
展开
-
G - 01Sequence(贪心&dsu)
G - 01Sequence(贪心&dsu) 区间按右端点排序,每次靠右填,填的时候用dsu快速找到最近的000。 查询的话用BIT维护即可。 每个位置最多被填一次,时间复杂度:O(mlogm+nlogn)O(mlogm+nlogn)O(mlogm+nlogn) #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int N=2e原创 2021-08-30 15:29:41 · 363 阅读 · 0 评论 -
E. Binary Matrix(dsu&滚动)
E. Binary Matrix(dsu&滚动) 考虑空间限制,采用滚动数组维护dsudsudsu。 注意合并的时候向左上合并,这样下一行状态才能继续更新。 时间复杂度:O(nmlogm)O(nmlogm)O(nmlogm) // Problem: E. Binary Matrix // Contest: Codeforces - Educational Codeforces Round 31 // URL: https://codeforces.ml/problemset/problem/884/原创 2021-08-26 15:35:16 · 345 阅读 · 0 评论 -
Black and white(MST)
Black and white(MST) 思路 考虑对题意中的操作进行分析: 假定这四个数组成的子矩形的左上角是:(x1,y1)\large (x_1,y_1)(x1,y1) 右下角是:(x2,y2)\large (x_2,y_2)(x2,y2) 要使得我们能进行该操作,则这两行两列中要有三个位置有数字的。 而位置(i,j)\large (i,j)(i,j)的数字就是第iii行第jjj列的连通桥梁。 为了更好的表达连通性,不妨人为定义一个顺序(逆时针),我们将点权转化为边权。 这样为了让四个点连通原创 2021-07-24 19:10:25 · 276 阅读 · 1 评论 -
P1186 玛丽卡(最短路&线段树&并查集)
P1186 玛丽卡(最短路&线段树&并查集) 题意:无向连通带权图,删掉一条边后所有最短路的最大值。 思路: 显然先跑一遍最短路,然后记录最短路的边,非最短路的边无影响,依次删除最短路的边跑最短路,时间复杂度:O(nmlogn)O(nmlogn)O(nmlogn),会T。 考虑如何优化。 考虑强制用其他非最短路跑最短路,会替换掉最短路的哪些路径,将这些路径的贡献该为利用其他边跑最短路的最小值,这样就变成了一个区间修改问题。 然后查找路径的话,可以利用并查集,将最短路上的路径的fa都标记为自己原创 2021-07-05 10:29:39 · 313 阅读 · 0 评论 -
AtCoder Beginner Contest 049(ABCD)
AtCoder Beginner Contest 049(ABCD) A - UOIAUAI 思路:特判即可。 B - Thin 思路:按题意模拟。 C - Daydream 思路:从后往前特判。 D - Connectivity 思路:求两个并查集的交集大小即可。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1原创 2020-08-13 09:38:31 · 460 阅读 · 0 评论 -
Interesting Computer Game(DFS||并查集)
Interesting Computer Game(DFS||并查集) 思路:转化为连通子图G<V,E>G<V,E>G<V,E>的顶点数之和,若无环贡献为顶点数,否则为顶点数减1. dfsdfsdfs做法 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7; #define ms原创 2020-08-03 19:44:08 · 1056 阅读 · 0 评论 -
Operating on a Graph(并查集)
Operating on a Graph(并查集) 思路:并查集+链表。 但是我的这个写法没体现出链表的优势。主要思路就是将当前询问结点xxx的相邻结点进行访问,如果根不是xxx就进行合并结点,更新并查集。 貌似有一个优化就是先将g[x]g[x]g[x]复制一份,然后清空,如果比当前子结点g[u]g[u]g[u]的大小要小,就直接交换。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=8原创 2020-07-19 10:13:25 · 373 阅读 · 0 评论 -
P3367 【模板】并查集
P3367 【模板】并查集 传送门 重新复习了一下并查集。 AC代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e4+5; #define mst(a) memset(a,0,sizeof a) int n,m,s[N],h[N]; int find(int x){ //查找 if(s[x]!=x) s[x]=find(s[x]); return s[x]; } int原创 2020-05-29 18:53:18 · 307 阅读 · 0 评论 -
B - 食物链(并查集)
B - 食物链(并查集) 思路:类似分层最短路的思路,将结点分为三层。这样就可以不同层的结点的边来表示关系了。然后用并查集维护三层结点即可。 AC代码: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<string> #include<cmath> using namespace std; typedef long lo原创 2020-05-20 22:24:32 · 407 阅读 · 1 评论 -
白魔法师(DFS&并查集)
白魔法师(DFS&并查集) 传送门 思路:dfsdfsdfs搜索每个白色连通块,用数组sz[i]sz[i]sz[i]纪录每个白色连通块的大小, 用数组bl[i]bl[i]bl[i]记录结点iii属于那个白色连通块。然后遍历一遍结点,如果是白色,则直接取最大值,如果是黑色,则答案=1+∑与u相连的结点vsz[v]=1+\sum\limits_{与u相连的结点v}sz[v]=1+与u相连的结点v∑sz[v] 时间复杂度:O(V+E)O(V+E)O(V+E) AC代码: #include<bits原创 2020-05-18 11:29:07 · 338 阅读 · 0 评论 -
F - Agri-Net (最小生成树&kruskal)
F - Agri-Net (最小生成树&kruskal) 思路:板子题。(第一次学这个算法标记一下)。思路就是对边排序,取n-1条边生成一棵权值和最小的树。生成树的过程用并查集实现。 AC代码: #include<cstdio> #include<cstring> #include<iostream> #include<queue> #in...原创 2020-04-21 10:42:11 · 413 阅读 · 0 评论 -
牛客小白月赛24 E.旅旅旅游(最短路&并查集)
牛客小白月赛24 E.旅旅旅游(最短路&并查集) 题目传送门 思路: AC代码: #include<bits/stdc++.h> using namespace std; const int N=1e5+5,M=5e5+5; typedef long long ll; ll d1[N],d2[N]; int n,m,s[N]; struct node{ ll d; ...原创 2020-04-20 12:30:55 · 358 阅读 · 0 评论 -
牛客小白月赛24 H.人人都是好朋友(离散化&并查集)
牛客小白月赛24 H.人人都是好朋友(离散化&并查集) 题目传送门 思路:将朋友的关系建立一个并查集。再遍历一遍,看两个敌人的根结点是否相同。 AC代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+5; #define mst(a) memset(a,0,...原创 2020-04-19 20:22:13 · 345 阅读 · 0 评论