题目描述


动物王国中有三类动物 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 句话,输出假话的总数。


输入输出格式

输入格式:

从 eat.in 中输入数据


第一行两个整数,N,K,表示有 N 个动物,K 句话。


第二行开始每行一句话(按照题目要求,见样例)


输出格式:

输出到 eat.out 中


一行,一个整数,表示假话的总数。



输入输出样例


输入样例#1:

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
输出样例#1:

3

说明


1 ≤ N ≤ 5 ∗ 10^4


1 ≤ K ≤ 10^5

这题显然要用并查集。因为只有3种动物,我的方法是对每个动物x建立3个集合:x表示与x同类的动物,x+n表示要x吃的动物,x+2*n表示吃x的动物。

对于每个读入的描述D X Y,做以下处理:

  • 如果X或Y不再区间[1,n]中,这句是假话。

  • D为1

如果x+n或x+2*n与y在同一个集合中说明已知x和y不是同一种动物,这句是假话;

否则,分别将x与y,x+n与y+n,x+2*n与y+2*n合并。

  • D为2

如果x与y在同一个集合中,说明已知x和y是同一种动物,这句是假话;

如果x+2*n与y在同一个集合中,说明已知y吃x,这句是假话;

否则,分别将x与y+2*n,x+n与y,x+2*n与y+n合并。

<hr>

说起来很复杂,实现起来其实很简单,代码见下:

 
//Gang
//fa[x+n]为x的食物,fa[x+2*n]为x的敌人
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#define FOR(x,y,z) for(int x=y;x<=z;x++)
#define REP(x,y,z) for(int x=y;x>=z;x--)
#define ll long long
using namespace std;
];
int a, x, y;
int Find(int x)
{
    int s,temp;
    s=x;
    while(x!=p[x])
    {
        x=p[x];
    }
    while(s!=x)
    {
        temp=p[s];
        p[s]=x;
        s=temp;
    }
    return x;
}
void Union(int x, int y)
{
    int xx = Find(x), yy = Find(y);
    if (xx != yy) p[xx] = yy;
}
int main()
{
    ;
    scanf("%d%d",&n,&k);
    FOR(i,,n*)p[i]=i;
    FOR(i,,k)
    {

        scanf("%d%d%d",&a,&x,&y);
         || y < )
        {
            ans++;
            continue;
        }
        )
        {
             * n) == Find(y))
            {
                ans++;
                continue;
            }
            Union(x, y);
            Union(x + n, y + n);
            Union(x +  * n, y +  * n);
        }
        else
        {
             * n) == Find(y))
            {
                ans++;
                continue;
            }
            Union(x, y +  * n);
            Union(x + n, y);
            Union(x +  * n, y + n);
        }
    }
    printf("%d",ans);
}

 

P2024食物链的更多相关文章

  1. P2024 食物链

    题面:P2024 食物链 emmm其实不太难想 开三倍的数组 1~n:是当前动物的同类 n~2*n:是当前动物吃的动物 2*n~3*n:是吃当前动物的动物 emmmm #include<iost ...

  2. 【luogu P2024 食物链】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2024 摘吊打集训队的九日dalao一句话 关于带有多个相对集合的全集,我们可以多开几倍的空间.每一倍的元素表 ...

  3. P2024 食物链(种类并查集)

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

  4. 洛谷P2024 食物链

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

  5. 洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo

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

  6. 种类并查集(洛谷P2024食物链)

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

  7. luogu P2024 食物链

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

  8. 洛谷P2024食物链——并查集补集的灵活运用

    题目:https://www.luogu.org/problemnew/show/P2024 自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变. 借鉴题解后,才明 ...

  9. P2024 食物链 (补集)

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

随机推荐

  1. 树莓派.使用Node.js来制作一个作业检查仪

    先上图 前段时间, 花了点时间给女儿做了个数学习题的小程序 首页 做题界面(题目每次都随机生成, 加减乘除都有) 做题记录 现在问题来了, 怎么才能随时知道作业有没有完成呢? 每次打开做题记录页面刷新 ...

  2. 数据分析与展示——NumPy库入门

    这是我学习北京理工大学嵩天老师的<Python数据分析与展示>课程的笔记.嵩老师的课程重点突出.层次分明,在这里特别感谢嵩老师的精彩讲解. NumPy库入门 数据的维度 维度是一组数据的组 ...

  3. 三、第一个IDEA创建的MAVEN工程——JavaWeb点滴

    一.Maven是什么? Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个 ...

  4. 【Salvation】——关卡功能&数据库基础实现

    写在前面:项目的关卡功能和数据库基础实现是小组其他成员实现的部分,这里作为学习总结.关卡功能块使用C#语言编写脚本,在Unity3D游戏引擎的环境中实现,数据库功能块使用PHP作为服务端获取MySQL ...

  5. Socket 的理解及实例

    Socket 的理解及实例Socket 的理解TCP/IP要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Intern ...

  6. python3 selenium模拟登陆斗鱼提取数据保存数据库

    # coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...

  7. C#继承中的override(重写)与new(覆盖)用法

    刚接触C#编程,我也是被override与new搞得晕头转向.于是花了点时间翻资料,看博客,终于算小有领悟,把学习笔记记录于此. 首先声明一个父类Animal类,与继承Animal的两个子类Dog类与 ...

  8. [转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

    转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的 ...

  9. Python进阶---面向对象第三弹(进阶篇)

    Python对象中一些方法 一.__str__ class Teacher: def __init__(self,name,age): self.name=name self.age=age self ...

  10. python基础-------函数(一)

    一 为何要有函数?不加区分地将所有功能的代码垒到一起, 问题是: 代码可读性差 代码冗余 代码可扩展差 如何解决?函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用 结论:函数使用必须 ...