首页 > 其他分享 >并查集

并查集

时间:2022-11-08 07:44:25浏览次数:69  
标签:cnt get int fy 假话 查集 fa

[NOI2001] 食物链

题目描述

动物王国中有三类动物 \(A,B,C\),这三类动物的食物链构成了有趣的环形。\(A\) 吃 \(B\),\(B\) 吃 \(C\),\(C\) 吃 \(A\)。

现有 \(N\) 个动物,以 \(1 \sim N\) 编号。每个动物都是 \(A,B,C\) 中的一种,但是我们并不知道它到底是哪一种。

有人用两种说法对这 \(N\) 个动物所构成的食物链关系进行描述:

  • 第一种说法是 1 X Y,表示 \(X\) 和 \(Y\) 是同类。
  • 第二种说法是2 X Y,表示 \(X\) 吃 \(Y\)。

此人对 \(N\) 个动物,用上述两种说法,一句接一句地说出 \(K\) 句话,这 \(K\) 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

  • 当前的话与前面的某些真的话冲突,就是假话;
  • 当前的话中 \(X\) 或 \(Y\) 比 \(N\) 大,就是假话;
  • 当前的话表示 \(X\) 吃 \(X\),就是假话。

你的任务是根据给定的 \(N\) 和 \(K\) 句话,输出假话的总数。

输入格式

第一行两个整数,\(N,K\),表示有 \(N\) 个动物,\(K\) 句话。

第二行开始每行一句话(按照题目要求,见样例)

输出格式

一行,一个整数,表示假话的总数。

样例 #1

样例输入 #1

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5

样例输出 #1

3

提示

对于全部数据,\(1\le N\le 5 \times 10^4\),\(1\le K \le 10^5\)。

种类并查集

...

std

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+9;
int n,m,cnt;
int fa[N*3];

int get(int x)
{
	if(fa[x] == x)return x;
	return fa[x] = get(fa[x]);
}


int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n*3;i++)fa[i] = i;
	//A:1~n B:n+1~2*n c:n*2+1~n*3
	while(m--)
	{
		int op,x,y;
		scanf("%d%d%d",&op,&x,&y);
		int fx = get(x),fy = get(y);
		if(x > n || y > n)cnt++;
		else if(op == 1)
		{
			if(fx == get(y+n) || fy == get(x+n))cnt++;
			else
			{
				fa[fy] = fx;
				fa[get(y+n)] = get(x+n);
				fa[get(y+2*n)] = get(x+2*n);
			}
		}
		else
		{
			if(x == y || fx == fy || fy == get(x+n))cnt++;
			else
			{
				fa[get(y+n)] = fx;
				fa[get(y+2*n)] = get(x+n);
				fa[fy] = get(x+2*n);
			}
		}
	}
	
	printf("%d",cnt);
	
	return 0;
}

标签:cnt,get,int,fy,假话,查集,fa
From: https://www.cnblogs.com/AC7-/p/16868449.html

相关文章

  • I-图的分割(二分+并查集)
    图的分割题目大意:给你n个点,m条边的图,没有重环和自环,所有的点都联通可以通过删除几条边使得整个图变成两个联通子图求删除的边中最大边权的最小值解题思路:看到“最......
  • 【模板】并查集 DSU
    postedon2021-09-1215:49:52|under模板|source0x00模板并查集维护的是这样一个问题:\(n\)个点,初始时每个点自己一个集合。\({\ttmerge}(x,y)\):合并\(x,y\)......
  • 啊哈之 最小生成树,并查集,快速排序
    6924113513463564236457121349132//输出19packagecom.company;importjava.io.FileInputStream;importjava.text.CollationKey......
  • D. Secret Passwords_并查集
    D.SecretPasswords题目大意给一堆字符串,两个串有一个字母一样就算等效。问所有字符串里有几个不等效的。思路并查集入门题llfa[N];llfind(llx){ returnfa[x......
  • 【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】
    importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;classSolution{List<Integer>list=newArrayList<>();intprimeNum=0......
  • 如何使用并查集解决朋友圈问题?
    本文已收录到 GitHub·AndroidFamily,有Android进阶知识体系,欢迎Star。技术和职场问题,请关注公众号[彭旭锐]私信我提问。前言大家好,我是小彭。今天分享到的是......
  • 【XSY4055】小K的疑惑(模拟最短路,值域并查集)
    题面小K的疑惑题解以下的数都是在\(b\)进制意义下讨论。默认\(n\geqb\),否则\(n<b\)可以特判答案为\(1\)。考虑DP,设\(d_r\)表示所有模\(n\)余\(r\)的正......
  • 普及-的并查集(都是板子)
        #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+7;structNode{ intbn,ed,t;}a[N];intf[N];intfind(intx){returnx==f[x]?x:......
  • 【XSY2485】MST(最小生成树+倍增lca+并查集)
    题面Description给定一个\(n\)个点\(m\)条边的连通图,保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成......
  • 【bzoj4358】permu【XSY1535】seq(莫队+并查集)
    考虑莫队,但是我们发现这个东东只支持\(ins\)(至于怎么支持等会再讲),不支持\(del\)操作,所以我们构造一种只\(ins\)不\(del\)的莫队。由于我们按莫队的方法排序,第一关键字为\(......