并查集
gjghfd
这个作者很懒,什么都没留下…
展开
-
bzoj1077 -- 并查集
看这位大佬的题解就可以了。http://blog.csdn.net/Fuxey/article/details/50573495代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 60 8 int i,j,k,n,m,f[N],g[N][N原创 2017-05-26 16:44:57 · 289 阅读 · 0 评论 -
[ 并查集 ] Codechef March Cook-off 2018 Div 1 Chef Chooses a Subset
定义边的权值为连接的两点权值的 andandand ,那么一个连通块所有点的 andandand 值等于所有边权的 andandand 值。 枚举答案的 andandand 值,再枚举权值包含它的所有边,用并查集求出最大连通块就好了。 复杂度为 O(α3logn)O(α3logn)\mathcal{O}(\alpha 3^{\log n}) 。#include<bits/stdc+...原创 2018-03-23 19:14:35 · 183 阅读 · 0 评论 -
[ 并查集 复杂度分析 杂题 ] Codeforces920E Connected Components?
记原图的补图中每个点的度数为 didid_i 。 先找出 didid_i 最小的点,将与其有边相连的点作为一个连通块,其他每个点单独作为一个连通块。暴力枚举 222 个连通块,再枚举其中的点,查询是否有边,有边则合并。 这样显然是正确的,然后就是复杂度的问题。 由于刚开始选的是 didid_i 最小的点,所以 di≤⌊mn⌋di≤⌊mn⌋d_i\le \lfloor{m\over n}\rf...原创 2018-02-27 14:15:49 · 526 阅读 · 0 评论 -
[ 并查集 ] BZOJ3319
和bzoj4551一样,用并查集将白色边缩起来就好了。#includeusing namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;原创 2018-01-26 17:38:36 · 217 阅读 · 0 评论 -
[ LCT 并查集 ] BZOJ4998
和长跑那题一样。将双联通分量用并查集缩起来就好了。#include#include#include#includeusing namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,原创 2018-01-08 16:31:00 · 301 阅读 · 0 评论 -
[ CDQ分治 并查集 ][ AHOI2013 ] BZOJ3237
分治到区间 [l,r][l,r] 时,将 [mid+1,r][mid+1,r] 中不在 [l,mid][l,mid] 出现的边加入,然后分治左区间,右区间类似。这样就能保证分治到一个区间时所有不在区间中的边都加入了。并查集维护图的连通就好了。#include<bits/stdc++.h>using namespace std;inline char nc(){ static char b原创 2017-12-04 18:24:46 · 218 阅读 · 0 评论 -
bzoj1202 [ HNOI2005 ] --带权并查集
http://www.lydsy.com/JudgeOnline/problem.php?id=1202 记s[i]=a[1]+a[2]+...+a[i],即s[i]为前缀和。再令v[i]=s[f[i]]-s[i],其中f[i]为i的父亲。对于每个读入的x,y,k,将x,y视为结点,如果x与y的根结点相同,因为v[y]-v[x]=s[f[y]]-s[y]-s[f[x]]-s[x]且f原创 2017-05-26 16:39:54 · 211 阅读 · 0 评论 -
bzoj1854 [ SCOI2010 ] --并查集
这题有一种神奇的并查集做法。将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论:1、如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点。2、如果一个有n个点的连通块的边数大于n-1,则我们可以满足这个连通块的所有点。 定义b数组,每读入一个装备的两个属性x,y,令f1为x所在连通块的根节点,f2为y所在连通块的根节点。若f1=f2:b[f1]=1;若原创 2017-05-26 16:40:35 · 178 阅读 · 0 评论 -
bzoj2733 [ HNOI2012 ] -- 并查集+线段树合并
用并查集记录每个联通块的根节点,每个联通块建一棵线段树,合并时合并线段树就可以了。代码: 1 #include 2 #include 3 #include 4 using namespace std; 5 #define N 100010 6 struct node{ 7 int l,r,x; 8 }c[N*20]; 9 int i,j,k,n,m,l,r,a[N]原创 2017-05-26 16:43:03 · 216 阅读 · 0 评论 -
[ ST表 并查集 树的直径 ] Codechef March Cook-Off 2018 Maximum Tree Path
先枚举 gcdgcdgcd ,把所有边找出来,按照权值小的端点排序,然后从大到小枚举边,并查集维护直径就好了。 时间复杂度 O(nAi−−√(logn+α))O(nAi(logn+α))\mathcal{O}(n\sqrt {A_i} (\log n +\alpha)) 。#include<bits/stdc++.h>using namespace std;char nc(...原创 2018-03-23 21:09:24 · 193 阅读 · 0 评论