2021-02-20

2021年2月20日

准确的说是昨天的总结吧

昨天晚上看并查集还没写完 然后就开始了写

发现自己生疏了好多

比如算法文件 algorithm 和iostream都不会写

昨天战果

代学长的宝可梦牧场中只有三种属性的宝可梦,水、火、草。这三种属性互相克制。(水克火,火克草,草克水)
现有N个宝可梦,以1-N编号,但是代学长并不知道每个宝可梦是什么属性。
孟学长调查了牧场之后,用两种说法对这N个宝可梦的属性进行描述:
第一种说法是"1 X Y",表示X和Y是同属性。
第二种说法是"2 X Y",表示X克Y。
孟学长对N个宝可梦,用上述两种说法,一句接一句地说出K句话,但是孟学长经常犯错,K句话有对有错。当一句话满足下列三条之一时,这句话就是错的,否则就是对的。
1) 当前的话与前面的某些对的话冲突,就是错的;
2) 当前的话中X或Y比N大,就是错的;
3) 当前的话表示X克X,就是错的。
孟学长每犯错一次就会收获一枚钉子,请根据给定的N(1 <= N <= 50,000)和K(0 <= K <= 100,000)句话,算出孟学长收获钉子的数量。

Input

第一行是两个整数N和K,以一个空格分隔。
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。
若D=1,则表示X和Y是属性。
若D=2,则表示X克Y。

Output

只有一个整数,表示钉子的数目。

Sample Input

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

Sample Output

3

解题的思路建立了三个树 来并查集

分别我1到n代表水n+1到2n代表火2n+1到3n代表草

然后假设每个宝可梦都在某种属性下记录了克制自己的元素

然后每次查询1到n时就可以查到第一个和他产生克制的宝可梦

这样 我们把同属性的宝可梦都记录了克制自己的宝可梦编号 

那么每次查询就是第一个克制自己这种属性的宝可梦

然后查询任意是不是同一属性属性题目是不是同根 也就是共同被某个属性克制 就ok了 换句话讲就查询他们是不是存在克制关系

反之查询他们是不是相克  有点迷糊了 容我想想在写

 

ac代码

#include<stdio.h>
int a[200000],n,m,k;
int find(int x)
{
	if(a[x]==x)
	return x;
	return a[x]=find(a[x]);
}
int join(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x==y)return 1;
	a[x]=y;
	return 1;
}
int judge(int d,int x,int y)
{
	if(x>n||y>n)return 0;
	if(d==1)
	{
		if(find(x+n)==find(y)||find(x)==find(y+n))
		return 0;
		join(x,y);
		join(x+n,y+n);
		join(x+2*n,y+2*n);
		
	}
	else 
	{
		if(x==y||find(x)==find(y)||find(y)==find(x+n))
		return 0;
		join(x,y+n);
		join(x+n,y+2*n);
		join(x+2*n,y);
		
	}
	return 1;
	
}
int main()
{
	scanf("%d%d",&n,&m);
		for(int i=1;i<=3*n;i++)
		a[i]=i;
		int count=0;
		while(m--)
		{	
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			if(!judge(x,y,z))count++;
		 } 
		 printf("%d\n",count);
	 
}

撸猫猫

不知从何时起,猫(Cat)已经开始成为一类校园新型毒品. 无数少女少男深受其害,一天不吸,浑身难受. 而就在最近,这种生物竟开始携带一种传染性极强的流行性病毒 —— 喵病毒 (Meow Viruses). 凡是接触猫的人,都极有可能感染喵病毒. 而我们一般称那些感染喵病毒的人,犯了喵病. 喵病的发病症状十分邪魔. 初期为连续性地疯狂撸猫,晚期甚至半夜爬上房顶学猫叫! 而由于喵病毒传染性极强,它已逐渐被认为是一种全球性的威胁. 为了减少传播给别人的机会, 最好的策略就是隔离可能的患者.

 

在Mr.蒟蒻的大学中,有许多学生团体. 同一个团体的学生经常彼此相通,一个学生可以同时加入几个团体. 为了防止喵病毒的传播,学校收集了所有学生团体的成员名单. 应对措施如下:

一旦一个团体中有一个患者,该团内的所有的成员就都可能是患者. 为了遏制这种病毒的传播,我们需要找到所有可能的患者. 现在已知编号为0的孟同学(感染源)已经犯了喵病,请你设计程序,找出所有可能的患者!

 

Input

输入文件包含多组数据,对于每组测试数据:

第一行依次为两个整数N和M, 其中N是学生的数量, M是学生团体的数量.
0 < N <=30000,0 <= M <= 500。

每个学生编号是一个0到N - 1之间的整数,一开始只有0号的孟同学被视为患者.

紧随的每一行是每一个团体的成员列表. 每行有一个整数K,代表成员数量. 之后有K个整数代表这个团体的学生. 一行中的所有整数由至少一个空格隔开. N = M = 0表示输入结束,不需要处理.

Output

对于每组测试数据, 一行输出一个正整数,即可能的患者数量。

Sample Input

100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0

Sample Output

4
1
1

这个题很简单 直接ac代码

#include<algorithm>
#include<cstring> 
#include<iostream>
///123
using namespace std;
int n;
int m;
int a[300005];
int find(int x)
{
	if(a[x]==x)return x;
	else return a[x]=find(a[x]);
 } 
int hb(int x,int y)
{
	if(find(x)==find(y))return 1;
	a[find(x)]=find(y);
	return 1;
}
int main()
{
	while(cin>>n>>m)
	{
		if(n==m&&n==0)break;
		for(int i=0;i<n;i++)
		a[i]=i;
		while(m--)
		{
			int k;
			cin>>k;
			int x;
			cin>>x;
			for(int i=1;i<k;i++)
			{
				int y;
				cin>>y;
				hb(x,y);
			}
		}
		int ans=0;
		int t=find(0);
		for(int i=0;i<n;i++)
		{
			if(t==find(i))ans++;
		}
		cout<<ans<<endl;

	}
 } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值