P1892 团伙 并查集 #include<cstdio> int fa[2500];//fa[i]表示i的朋友所在集合,fa[i+n]表示i的敌人所在集合 bool boo[2500]; int ans,n,m; int find(int x) { if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } void union1(int x,int y) { int fx=find(x); int fy=find(y); fa[fx]=fy; }//标准…
题目大意:有n个人,关系为:朋友的朋友是朋友,敌人的敌人是朋友.如果是朋友就在一个团队内,是敌人就不在,现在给出一关系,问最多有多少团伙.题解:并查集,建反集,如果是朋友,就把他们的并查集合并:如果是敌人,就把他们分别和对方的反集合并,统计最后有几个联通块 C++ Code: #include<cstdio> using namespace std; const int maxn=1010<<1; int n,m,ans; int f[maxn]; char ch[10]; int…
又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个位置可供自由选择. 所以答案就是10^(并查集数),去除前导0:*(9/10) 好,这样我们得到了一个O(mn)算法. 然后我们考虑优化:每个区间可能被合并多次.所以我们有两种选择:线段树/ST表. 考虑到这是ST表例题(???????),我们就来个ST表与并查集联动求解... 我们的ufs[i][…
题目:https://www.luogu.org/problemnew/show/P4092 利用并查集,倒序离线,那么从倒序来看被撤销标记的点就再也不会被标记,所以用并查集跳过: 莫名其妙的WA,调了一晚上,好像是dfs的地方有问题,莫名其妙的:注释掉的是WA的,现有的可以A,不知怎的. 代码如下: #include<iostream> #include<cstdio> using namespace std; ; int n,q,head[MAXN],ct,fa[MAXN],a…
题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 pty 却不高兴,他不喜欢白色的世界,他觉得这样太单调了.所以他想对雪花进行染色,让世界变得多彩些. 题目描述 现在有 N 片雪花排成一列. Pty 要对雪花进行 M 次染色操作,第 i次染色操作中,把第(i*p+q)%N+1 片雪花和第(i*q+p)%N+1 片雪花之间的雪花(包括端点)染成颜色 i…
两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<cmath> using namespace std; const int maxn = 1000 + 4; int p[maxn]; int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } struct Point { double x…
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪,它的高度为 $ h $ ,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为 $ z=0 $ ,奶酪的上表面为 $ z=h $ . 现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在…
题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后这\(n\)个点的颜色. 题解:我们可以反着从第\(m\)次开始染,因为后面的会把前面点的颜色覆盖,所以倒着来的话,下一次染的时候就可以不用考虑已经染过的区间了,那么我们怎么维护染过的区间呢?我们可以把这些区间看成是一些连通块,所以可以用并查集来对区间进行维护,让区间内的所有点均指向它的右端点,具体…
题目:https://www.luogu.org/problemnew/show/P2024 自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变. 借鉴题解后,才明白原来就是把其补集也进行合并:由于fa数组在改变,不要定义一个变量为原来的find()在后面使用. 原来的乱七八糟代码: #include<iostream> #include<cstdio> using namespace std; int n,k,s; int fa[2000005…
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1892 通过读题可以很清楚的发现这是一个并查集的题,并且要有两个集合: 若他们p和q是朋友,则存入第一个集合:若他们是敌人,则存入第二个集合——即反集(很模糊的一个东西 因为最多只有n个数,所以我们将f数组一分为二,f [1] ~ f [n] 为第一个集合, f [n+1] ~ f [n + n] 为反集,然后根据题意进行并查集的基本操作即可... 本题细节: (1) 注意读题,最后要求的一共有多…