题目描述


动物王国中有三类动物 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. 走进 Xamarin Test Recorder for Xamarin.Forms

    此篇是承接之前 走进 UITest for Xamarin.Forms 的,所以如果没有看过之前的可以先看下之前的 UITest 比起上一篇纯敲代码只适合程序员的 UITest ,这一篇不管是程序员还 ...

  2. 什么是Echarts?Echarts如何使用?

    什么是Echarts? Echarts--商业级数据图表    商业级数据图表,它是一个纯JavaScript的图标库,兼容绝大部分的浏览器,底层依赖轻量级的canvas类库ZRender,提供直观, ...

  3. Best MVC Practices(最优的MVC布局)

    Best MVC Practices 最优的MVC布局策略 Model View Controller 1.数据层 2.视图层 3.控制器层 Although Model-View-Controlle ...

  4. tomcat默认日志路径更改

    在项目访问量不断增加时,tomcat下logs也迅速增大,有时甚至因为填满了所在分区而出现无空间写入日志而导致程序出问题. 这时要更改logs的默认目录,指向更大的磁盘.修改主要有两步: 1. 修改t ...

  5. VS2008中C#开发webservice简单实例

    1.创建工程 文件-> 新建->网站 如下图. 工程建好后,会自动添加如下代码: using System; using System.Linq; using System.Web; us ...

  6. 高性能前端框架React详解

      前  言 React 是一个用于构建[用户界面]的 JAVASCRIPT 库. React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图). React 起源于 Facebo ...

  7. Azure ASM虚拟机部署“安全扩展”

    Azure虚拟机,默认情况下没有安装杀毒软件.如果您有此需求可以通过Azure 扩展进行安装,有关Azure反恶意软件的官方说明请参考:https://docs.azure.cn/zh-cn/secu ...

  8. touch pointer

    在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种:而当时的鼠标事件,其实就是 click.mousedown.mouseup 等等的事件.但是当手机.平板开始流行时候,再移动装置上的主 ...

  9. PHPMailer 发送邮件(二)

    发现PHPMailer又做了较大的更新,以前发送邮件的方法已不太适用,刚好要做一个实验,需要搭建个环境,这里使用Gmail进行测试,现记录下来. 传送地址Github: PHPMailer 基本要求的 ...

  10. J1002.JavaFX简介

    引言 2008年12月05日,SUN发布了JavaFX第一个正式版本,以期望Java在UI端能够更好地应用于开发富客户端的互联网应用(Rich Internet Cliet). 2011年发布的Jav ...