题目描述


动物王国中有三类动物 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. Linux.挖矿.cpuminer方法记录

    挖矿一般都要用高端显卡做矿机, 不是一般人玩得起 这里讲的是一种用CPU来挖矿的方法, 纯玩玩, 不要指望能致富喔 本方法在CentOS和树莓派原生系统上测试通过 先从git下载cpuminer gi ...

  2. 理解vue中的scope的使用

    理解vue中的scope的使用 我们都知道vue slot插槽可以传递任何属性或html元素,但是在调用组件的页面中我们可以使用 template scope="props"来获取 ...

  3. jQrid常用操作(转帖)

    转自: http://blog.csdn.net/zhcj3672/article/details/6944955 JqGrid相关操作备忘 方法列表 1.获得当前列表行数: $("#gri ...

  4. TensorFlow Object Detection API(Windows下测试)

    "Speed/accuracy trade-offs for modern convolutional object detectors." Huang J, Rathod V, ...

  5. 在Windows上搭建PhoneGAP(crodova)的开发环境

    PhoneGAP是一个可以将web应用打包成移动应用的开源框架,使用它可以迅速的将HTML.CSS和JavaScript开发的web应用打包成跨平台的移动应用程序,而Apache Cordova是Ph ...

  6. 使用bower init创建bower.json文件

    使用bower init 可以快速创建bower.json文件 bower init 回答一系列问题后就可以了,其中大部分问题可以按enter跳过.

  7. Lua的函数调用和协程中,栈的变化情况

    Lua的函数调用和协程中,栈的变化情况 1. lua_call / lua_pcall   对于这两个函数,对栈底是没有影响的--调用的时候,参数会被从栈中移除,当函数返 回的时候,其返回值会从函数处 ...

  8. Leetcode题解(33)

    113. Path Sum II 题目 分析: 主要考察二叉树深度优先遍历(DFS),递归调用当前节点的左右结点即可,代码如下(copy网上): /** * Definition for binary ...

  9. HDU1792A New Change Problem(GCD规律推导)

    A New Change Problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. 利用PowerShell 得到 进程总共占用的内存

    $task = tasklist /nh /fo csv $total = 0 for($i=0; $i -lt $task.count; $i++) { $one = $task[ $i ].Spl ...