题目链接

思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,所以我们干脆建立三倍于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. 解决wampserver无法启动问题

    如果无法启动,找不到原因.直接依次点击打开到:控制面板--管理工具--事件查看器--windows日志--应用程序,查看对应进程错误信息对症下药即可. 我这个错误就是8099端口错误,运行cmd命令, ...

  2. DEDECMS首页循环调用一级栏目和二级栏目的实现方法

    调用方法: {dede:channelartlist typeid='2'} <li class="First"><a href="{dede:fiel ...

  3. 腾讯云与 Grafana Labs 达成深度合作, 推出全新 Grafana 托管服务

    9 月 23 日,腾讯云宣布与业界领先的开源数据可视化公司 Grafana Labs 达成深度合作协议,共同开发和验证全新的 Grafana 托管服务,通过 Grafana Labs 开源软件与腾讯云 ...

  4. Spring Cloud Hystrix 学习(三)请求合并

    什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...

  5. DevOps与CICD简介

    整体知识点 ·Devops与CI/CD简介 ·Gitlab安装与Git命令使用 ·Gitlab实现持续集成 ·Gitlab实现分支管理 ·Jenkins简介及安装 ·Jenkins插件管理及基础配置 ...

  6. python的列表和java的数组有何异同

    今天面试被问到,自己学习一下. python的列表是可变长的,定义时不需要指定长度:pyhton是弱对象类型,python的列表存储的数据类型可以不相同:python的列表更加灵活,如可以通过''命令 ...

  7. Java线程类

    基础知识 线程状态 根据Thread.State类中的描述,Java中线程有六种状态:NEW,RUNNABLE,WAITING,TERMINATED,BLOCKED. 就绪状态(NEW):当线程对象调 ...

  8. P7736-[NOI2021]路径交点【LGV引理】

    正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有\(k\)层的图,第\(i\)层有\(n_i\)个点,每层的点从上到下排列,层从左到右排列.再 ...

  9. Jmeter压测学习6---登录参数CSV

    前言 我们在压测登录接口的时候,如果只用一个账号去设置并发压测,这样的结果很显然是不合理的,一个用户并发无法模拟真实的情况.如果要压测登录接口,肯定得准备几百,甚至上千的账号去登录,测试的结果才具有可 ...

  10. Django整理(三) - 配置文件&静态文件

    项目常用配置 在项目的 setting.py 配置文件中,进行项目相关配置的修改. 1. BASE_DIR 当前项目的根目录,Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路 ...