题目链接

思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,所以我们干脆建立三倍于n的空间,1~n这三分之一用来存第i只动物是A的情况,n+1~2n这三分之一用来存第(i-n)只动物是B的情况,2n+1~3n这三分之一用来存这只动物是C的情况。对于每一句话给出的关系,我们并不知道其中的两个动物分别是属于哪一个种类的,所以我们就把每一种情况都处理一遍。当两个属于同一个区间的动物被合并时,就代表它们是同一个种类的;当两个属于不同区间的动物被合并时,就代表作为父节点的那一只动物吃作为子节点的那一只动物。照这样处理每一句真话即可。判断假话时,第2、3种假话是很容易判断的,若是第一种假话就这样判断:如果说的是x与y是同类的话,就判断x有没有和不在同一区间的y合并(这代表x吃y)以及y有没有和不在同一区间的x合并(这代表y吃x),如果有,这就是假话;如果说的是x吃y,就判断x有没有和在同一区间的y合并(这代表x和y是同类)以及y有没有和不在同一区间的x合并(这代表y吃x),如果有,这就是假话。最后输出答案即可。
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int f[150005];//f[1~n]存动物A,f[n+1~2n]存动物B,f[2n+1~3n]存动物C
int find_(int x)//并查集找祖先函数
{
if(f[x]==x) return x;//找到了祖先就返回祖先是哪一个
return f[x]=find_(f[x]);//路径压缩+查找
}
void merge_(int x,int y)//并查集合并函数
{
int t1=find_(x),t2=find_(y);//找各自的祖先
if(t1!=t2) f[t2]=t1;//如果不在同一个集合内就合并
return;//结束
}
int main()
{
int n=0,k=0,ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n*3;i++) f[i]=i;//并查集初始化
for(int i=1;i<=k;i++)
{
int s=0,x=0,y=0;
scanf("%d%d%d",&s,&x,&y);
if(x>n||y>n||s==2&&x==y) ans++;//判断属于第2、3种情况的假话
else
if(s==1)//如果此句话说的是x和y为同类
//如果前面的话中已经出现x吃y或y吃x的情况,就说明它们不是同类且这一句话是假话
if(find_(x)==find_(y+n)||find_(y)==find_(x+n)) ans++;
else//否则就说明这一句话是真的
{
//考虑3种情况
merge_(x,y);//若它们均为动物A,则合并x,y
merge_(x+n,y+n);//若它们均为动物B,则合并x+n,y+n
merge_(x+n*2,y+n*2);//若它们均为动物B,则合并x+n*2,y+n*2
}
else//如果此句话说的是x吃y
//如果前面的话中已经出现x与y是同类或y吃x的情况,就说明x不吃y且这一句话是假话
if(find_(x)==find_(y)||find_(y)==find_(x+n)) ans++;
else//否则就说明这一句话是真的
{
//考虑3种情况
merge_(x,y+n);//若x为A且y为B,将y+n合并到x下,表示x吃y+n
merge_(x+n,y+n*2);//若x为B且y为C,将y+n*2合并到x+n下,表示x+n吃y+n*2
merge_(x+n*2,y);//若x为C且y为A,将y合并到x+n*2下,表示x+n*2吃y
}
}
printf("%d",ans);//输出
return 0;
}

Luogu P2024 [NOI2001]食物链 | 并查集的更多相关文章

  1. P2024 [NOI2001]食物链 并查集

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  2. Luogu P2024 [NOI2001]食物链

    并查集 首先先要读懂题目,a是b的食物的话,b的天敌是a,b的食物是a的天敌 比如,人吃鸡,鸡吃草,那么草吃人..... 所以建3个并查集,+n时表示这是其食物,+2*n时表示这是其天敌 所以当x,y ...

  3. 【题解】P2024 [NOI2001]食物链 - 数据结构 - 并查集

    P2024 [NOI2001]食物链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 动物王国中有三类动物 \(A,B ...

  4. 洛谷 P2024 [NOI2001]食物链 解题报告

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...

  5. 编程算法 - 食物链 并查集 代码(C)

    食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...

  6. [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)

    [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...

  7. P2024 [NOI2001]食物链(种类并查集)

    题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...

  8. 种族并查集模板题分析 -----P2024 [NOI2001]食物链

    本文参考了:洛谷p2024题解 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都 ...

  9. 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护

    先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...

随机推荐

  1. php后台解决跨域

    protected function _initalize() { header("content-type:text/html;charset=utf-8"); header(& ...

  2. JS验证监听输入银行卡号

    $("#AccountNum").keydown(function(e) { if(!isNaN(this.value.replace(/[ ]/g,""))) ...

  3. Docker系列(13)- 部署es+kibana

    部署elasticsearch # es 暴露的端口很多 # es 十分的消耗内存 # es 的数据一帮需要放置到安全目录!通过挂载实现 # DockerHub上安装文档,其中 --net somen ...

  4. Shell系列(27)- 条件判断之两个整数比较

    两个整数之间比较 Liunx中,都是字符型,但是加了数值比较的选项,所以自动将他们转换成了整数型进行比较,不需要对这些参数进行变量转换或者重新声明 测试选项 作用 整数1 -eq 整数2 判断整数1是 ...

  5. Python+Pygame开发太空大战/飞机大战完整游戏项目(附源代码)

    项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧!  游戏画面动态且丰富哦!   需求分析 利用Pyt ...

  6. windows系统升级python

    卸载python最干净的办法 https://blog.csdn.net/ic_zswdbk/article/details/88315779?utm_medium=distribute.pc_rel ...

  7. Spring Cloud Gateway 没有链路信息,我 TM 人傻了(下)

    本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...

  8. JSP页面属性

    一.JSP指令 <%@指令名属性名=属性值 %> page指令: 定义页面是如何解析 include指令: 静态包含 taglib指令: 在页面引入标签呢库. 1.page指令属性 imp ...

  9. 通用JS七

    instanceof 在原型链上寻找这个属性的定义 match 正则匹配字符串 Symbol() Symbol()函数不能用作构造函数,与new关键字一起使用.这样做是为了避免创建符号包装对象,像使用 ...

  10. apiserver源码分析——启动流程

    前言 apiserver是k8s控制面的一个组件,在众多组件中唯一一个对接etcd,对外暴露http服务的形式为k8s中各种资源提供增删改查等服务.它是RESTful风格,每个资源的URI都会形如 / ...