【E - 食物链】

80 篇文章 0 订阅
80 篇文章 0 订阅

思路:

  • 基础种类并查集,注意取余+3
  • 读到文件尾会 WA,真是

总结:

  • 逻辑判断类题,当同属于同一集合(头元素相同)时进行判断;不属于同一集合时,合并。

代码:

  • 282ms 1116kB
//282ms		1116kB


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 50005;

int N,K;
int ans;
int par[maxn];
int val[maxn];

void INIT(){
	ans = 0;
	memset(par , -1 , sizeof(par)) ;
	memset(val , 0  , sizeof(val)) ;
	return ;
}

int FIND(int i){
	if(par[i] == -1)
		return i;
	int temp = par[i];
	par[i] = FIND(par[i]);
	val[i] = (val[temp] + val[i])%3;
	return par[i];
}

void UNION(int w,int l,int r,int parl,int parr){
	par[parr] = parl;
	val[parr] = (val[l] + w - val[r] + 3) % 3;
	return ;
}

int main(){
	cin>>N>>K;
	INIT();
	while(K--){
		int type ;
		int l , r;
		scanf("%d%d%d" , &type , &l , &r);
		if(l>N || r>N || l<1 || r<1 || (type == 2 && l == r)){
			ans++ ;
			continue;
		}
		int parl = FIND(l);
		int parr = FIND(r);
		if(type == 1){
			if(parr == parl)
				if(val[l] != val[r])
					ans++;
				else	 ;
			else
				UNION(0 , l , r , parl , parr);
		}
		else{
			if(parr == parl)
				if((val[l] + 1)%3 != val[r])
					ans++;
				else	 ;
			else
				UNION(1 , l , r , parl , parr);
		}
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值