1074 食物链

2001年NOI全国竞赛

时间限制: 3 s
空间限制: 64000 KB
题目等级 : 钻石 Diamond
 
 
 
 
题目描述 Description

动物王国中有三类动物 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句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。   

1) 当前的话与前面的某些真的话冲突,就是假话;   

2) 当前的话中X或Y比N大,就是假话;   

3) 当前的话表示X吃X,就是假话。   

你的任务是根据给定的N(1<=N<=50,000)和K句话(0<=K<=100,000),输出假话的总数。

输入描述 Input Description

第一行是两个整数N和K,以一个空格分隔。   

以下K行每行是三个正整数D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。   

若D=1,则表示X和Y是同类。   

若D=2,则表示X吃Y。

输出描述 Output Description

只有一个整数,表示假话的数目。

样例输入 Sample Input

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

输入文件

对7句话的分析 100 7

1 101 1  假话

2 1 2    真话

2 2 3    真话

2 3 3    假话

1 1 3    假话

2 3 1    真话

1 5 5    真话

NOI 2001 食物链(eat)

数组一定要开的足够大

对每个对象有3种状态。我们可以开3倍的数组,分别维护对象的三种状态。(因为我们无法确定该对象是A/B/C中的哪种)。
fa[i]、fa[i+n]、 fa[i+2n]
如果对象X,Y是同类。
则我们将3个状态分别连边。
fa[x] <-> fa[y]
fa[x+n]<->fa[y+n]
fa[x+2*n]<->fa[y+2*n]
如果X、Y不是同类存在捕食关系。(设X eat Y)
则我们将
fa[x] <-> fa[y+n] (A->B)
fa[x+n] <-> fa[y+2*n] (B->C)
至于什么要连
fa[x+2*n] <-> fa[y] (C->A)
(其实不连好像也可以,但是我写不出来)

我们需要描述3种关系。

  • 同类关系。
  • 捕食关系
  • 被捕食关系
  • #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int MAXN=;
    const int maxn=0x7fffffff;
    int tot=;
    int f[MAXN];// 同伙
    int x,y;
    int fx1,fx2,fx3,fy1,fy2,fy3;
    int find(int x)
    {
    if(f[x]!=x)
    f[x]=find(f[x]);
    return f[x];
    }
    int unionn(int x,int y)
    {
    f[x]=y;
    }
    int main()
    {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=;i<=n*;i++)
    f[i]=i;
    for(int i=;i<=m;i++)
    {
    int p;
    scanf("%d",&p);
    if(p==)// x y 是同类
    {
    int x,y;
    scanf("%d%d",&x,&y);
    if((x>n||y>n))
    {
    tot++;
    continue;
    }
    fx1=find(x);
    fx2=find(x+n);
    fx3=find(x+*n);
    fy1=find(y);
    fy2=find(y+n);
    fy3=find(y+*n);
    if(fx1==fy2||fx1==fy3)
    {
    tot++;
    continue;
    }
    else
    {
    unionn(fx1,fy1);
    unionn(fx2,fy2);
    unionn(fx3,fy3);
    }
    }
    else // x吃y
    {
    scanf("%d%d",&x,&y);
    if((x>n||y>n)||(x==y))
    {
    tot++;
    continue;
    }
    fx1=find(x);
    fx2=find(x+n);
    fx3=find(x+*n);
    fy1=find(y);
    fy2=find(y+n);
    fy3=find(y+*n);
    if(fx1==fy1||fx1==fy3)
    {
    tot++;
    continue;
    }
    else
    {
    unionn(fx1,fy2);
    unionn(fx2,fy3);
    unionn(fx3,fy1);
    }
    }
    }
    printf("%d",tot);
    return ;
    }

1074 食物链 2001年NOI全国竞赛的更多相关文章

  1. Codevs 1074 食物链 2001年NOI全国竞赛

    1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...

  2. CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)

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

  3. 食物链 2001年NOI全国竞赛

    时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond   题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...

  4. Codevs 1800 假面舞会 2008年NOI全国竞赛

    1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...

  5. 1729 单词查找树 2000年NOI全国竞赛

    1729 单词查找树 2000年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master         题目描述 Description 在进行文法分析的 ...

  6. 2008年NOI全国竞赛 假面舞会

    /* 分三种情况 1 有环:找环长的gcd作为max gcd的超过2的最小因子作为min 2 树:所有最长链的和作为max 3为min (最长链≥3) 3 两条相交链:找出所有的这样的两条链的差 同1 ...

  7. 1722 最优乘车 1997年NOI全国竞赛

    题目描述 Description H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士 ...

  8. 银河英雄传说 2002年NOI全国竞赛

    时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年 ...

  9. NOI全国赛(2001)--食物链

    今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...

随机推荐

  1. C++11新标准

    1. 新类型 long long和unsigned long long: char16_t 和 char32_t: 新增原始字符串: 2. 统一的初始化 C++11扩大了用大括号括起的列表(初始化列表 ...

  2. 树莓派 Learning 002 装机后的必要操作 --- 02 解决中文问题

    树莓派 装机后的必要操作 - 解决中文问题 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 每一块树莓派,装机后都应该执行的步骤 刚装机后, ...

  3. 【PHP】Composer使用简介,composer install 和 update 区别

    1.composer是php的依赖包管理工具 2.符合PSR-0/1/2/3/4 规范 3.composer安装推荐使用国内镜像 4.composer require/install/update 区 ...

  4. hdu1085

    #include <iostream> #include <cstring> using namespace std; int n[3],a[9000],b[9000],i,j ...

  5. 《OD大数据实战》Spark入门实例

    一.环境搭建 1. 编译spark 1.3.0 1)安装apache-maven-3.0.5 2)下载并解压 spark-1.3.0.tgz 3)修改make-distribution.sh  VER ...

  6. hdu3830(lca + 二分)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3830 题意: 有三个点 a, b, c, 对于其中任意一点 x 可以跨过一个点移动到另一个位置, 当 ...

  7. 2017-10-19 NOIP模拟赛

    Count(哈格朗日插值) 题解: 有个定理,另sum(x)表示小于等于x的数中与x互质的数的和 sum(x)=φ(x)*x/2    最后可知f(x)=x  (f(1)=2)  当然打表能知道. 然 ...

  8. [Xcode 实际操作]三、视图控制器-(4)使用UINavigationController导航栏和工具栏

    目录:[Swift]Xcode实际操作 本文将演示如何显示和隐藏导航视图的导航栏和工具栏 打开第一个视图控制器 import UIKit class FirstSubViewController: U ...

  9. Python中print()函数不换行的方法

    一.让print()函数不换行 在Python中,print()函数默认是换行的.但是,在很多情况下,我们需要不换行的输出(比如在算法竞赛中).那么,在Python中如何做到这一点呢? 其实很简单.只 ...

  10. 高斯消元法的C++简单实现

    高斯消元法 首先,我们导入几个概念. 定义1: 一个矩阵称为阶梯形(行阶梯形),若它有以下三个性质: 1.每一非零行在每一零行之上: 2.某一行的先导元素所在的列位于前一行先导元素的后面: 3.某一行 ...