P2024 [NOI2001]食物链

声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。

题目描述

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

现有 \(N\) 个动物,以 \(1 - 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\) 句话,输出假话的总数。


Solution

接触并查集已经有好一段时间了,但还是第一次见这种(我太菜了

在同一个并查集中的元素并不一定代表它们是同一种,而是代表它们之间有关系

于是就用一个 \(3\) 倍的并查集来写

设 \(1\ -\ n\) 吃 \(n+1\ -\ 2*n\) ,\(n+1\ -\ 2*n\) 吃 \(2 * n + 1\ -\ 3 * n\) ,\(2 *n + 1\ -\ 3 * n\) 吃 \(1\ -\ n\)

由于只需知道它们之间的关系,而固定是 \(A\ B\ C\) 哪一个集合并不重要,所以在连边时要把三个集合中每个都连起来

\(eg:\ n = 5\) 时,\(2\) 吃 \(3\),则要把 \(2\) 和 \(3 + 5\) ,\(2 + 5\) 和 \(3 + 2 * 5\) ,\(2 + 2 * 5\) 和 \(3\) 都连起来

这里可以参照这篇博客 , 我觉得有他画的图就很容易理解


Code

#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<cmath>
#define F(i, x, y) for(int i = x; i <= y; ++ i)
using namespace std;
int read();
const int N = 150000;
int n, k, ans;
int x, y, z;
int s[N];
int search(int x)
{
int n = x, tmp;
while(x != s[x]) x = s[x];
while(n != x) tmp = s[n], s[n] = x, n = tmp;
return x;
}
int main()
{
n = read(), k = read();
F(i, 1, 3 * n) s[i] = i;
while(k --)
{
z = read(), x = read(), y = read();
if((x == y && z == 2) || x > n || y > n) {++ ans; continue;}
if(z == 1)
{
if(search(x) == search(y + n) || search(x) == search(y + 2 * n)) {++ ans; continue;}
if(search(x) != search(y))
s[search(x)] = search(y), s[search(x + n)] = search(y + n), s[search(x + 2 * n)] = search(y + 2 * n);
}
if(z == 2)
{
if(search(x) == search(y + 2 * n) || search(x) == search(y)) {++ ans; continue;}
if(search(x) != search(y + n))
s[search(x)] = search(y + n), s[search(x + n)] = search(y + 2 * n), s[search(x +2 * n)] = search(y);
}
}
printf("%d", ans);
return 0;
}
int read()
{
int x = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x;
}

【题解】P2024 [NOI2001]食物链 - 数据结构 - 并查集的更多相关文章

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

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

  2. 洛谷 P2024 [NOI2001]食物链 (并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...

  3. P2024 [NOI2001]食物链[扩展域并查集]

    大水题一道啊,几分钟切掉. 还是扩展域,每个点拆3个点,之间连边表示有关系(即捕食关系).然后随便判定一下就好了,不难,毕竟NOI上古题目. #include<iostream> #inc ...

  4. [NOI2001] 食物链 (扩展域并查集)

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

  5. [NOI2001]食物链(并查集拓展域)&& [HAOI2006]旅行(Kruskal)

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

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

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

  7. 洛谷 P2024 [NOI2001]食物链

    题意简述 有人用两种说法对这 N 个动物所构成的食物链关系进行描述: 1."1 X Y",表示 X 和 Y 是同类. 2."2 X Y",表示 X 吃 Y . ...

  8. 算法手记 之 数据结构(并查集详解)(POJ1703)

    <ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元 ...

  9. ACM数据结构-并查集

    ACM数据结构-并查集   并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...

随机推荐

  1. TensorFlow 中文资源精选,官方网站,安装教程,入门教程,实战项目,学习路径。

    Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...

  2. 模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo...

    近日,TensorFlow模型优化工具包又添一员大将,训练后的半精度浮点量化(float16 quantization)工具. 有了它,就能在几乎不损失模型精度的情况下,将模型压缩至一半大小,还能改善 ...

  3. Java中使用RSA算法加密

    Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...

  4. Python常用模块之模块的使用

      一 模块介绍 1.什么是模块? #常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用. #在python中,模块 ...

  5. CSAPP实验——DataLab

    任务:按照要求补充13个函数,会限制你能使用的操作及数量 bitXor(x,y) 只使用 ~ 和 & 实现 ^ tmin() 返回最小补码 isTmax(x) 判断是否是补码最大值 allOd ...

  6. 关于Cookie的相关知识点以及使用方法

    首先介绍cookie的一些方法 response.addCookie(Cookie cookie)是将一个cookie对象传入客户端. Cookie cookie=new Cookie(String ...

  7. 【django基础】django接口 异步ajax请求 导出数据库成excel表(包裹前端后端)

    py文件: from django.utils.http import urlquote from rest_framework.views import APIView from django.sh ...

  8. ssm整合简单例子

    1.首先新建一个maven项目 2.在pom.xml文件中加入以下代码引入包 <properties> <project.build.sourceEncoding>UTF-8& ...

  9. [Python] 字符串加密解密

    1. 最简单的方法是用base64: import base64 s1 = base64.encodestring('hello world') s2 = base64.decodestring(s1 ...

  10. HTML5实现刷脸支付

    最近刷脸支付很火,老板们当然要追赶时代潮流,于是就有了刷脸支付这个项目.前端实现关键的技术是摄像头录像,拍照和人脸比对,本文来探讨一下如何在html5环境中如何实现刷脸支付以及开发过程中遇到的问题. ...