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种关系。

  • 同类关系。
  • 捕食关系
  • 被捕食关系
    1. #include<iostream>
    2. #include<cstdio>
    3. #include<cstring>
    4. using namespace std;
    5. const int MAXN=;
    6. const int maxn=0x7fffffff;
    7. int tot=;
    8. int f[MAXN];// 同伙
    9. int x,y;
    10. int fx1,fx2,fx3,fy1,fy2,fy3;
    11. int find(int x)
    12. {
    13. if(f[x]!=x)
    14. f[x]=find(f[x]);
    15. return f[x];
    16. }
    17. int unionn(int x,int y)
    18. {
    19. f[x]=y;
    20. }
    21. int main()
    22. {
    23. int n,m;
    24. scanf("%d%d",&n,&m);
    25. for(int i=;i<=n*;i++)
    26. f[i]=i;
    27. for(int i=;i<=m;i++)
    28. {
    29. int p;
    30. scanf("%d",&p);
    31. if(p==)// x y 是同类
    32. {
    33. int x,y;
    34. scanf("%d%d",&x,&y);
    35. if((x>n||y>n))
    36. {
    37. tot++;
    38. continue;
    39. }
    40. fx1=find(x);
    41. fx2=find(x+n);
    42. fx3=find(x+*n);
    43. fy1=find(y);
    44. fy2=find(y+n);
    45. fy3=find(y+*n);
    46. if(fx1==fy2||fx1==fy3)
    47. {
    48. tot++;
    49. continue;
    50. }
    51. else
    52. {
    53. unionn(fx1,fy1);
    54. unionn(fx2,fy2);
    55. unionn(fx3,fy3);
    56. }
    57. }
    58. else // x吃y
    59. {
    60. scanf("%d%d",&x,&y);
    61. if((x>n||y>n)||(x==y))
    62. {
    63. tot++;
    64. continue;
    65. }
    66. fx1=find(x);
    67. fx2=find(x+n);
    68. fx3=find(x+*n);
    69. fy1=find(y);
    70. fy2=find(y+n);
    71. fy3=find(y+*n);
    72. if(fx1==fy1||fx1==fy3)
    73. {
    74. tot++;
    75. continue;
    76. }
    77. else
    78. {
    79. unionn(fx1,fy2);
    80. unionn(fx2,fy3);
    81. unionn(fx3,fy1);
    82. }
    83. }
    84. }
    85. printf("%d",tot);
    86. return ;
    87. }

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. [tyvj1860]后缀数组

    题目链接:http://www.tyvj.cn/p/1860 解题关键:模板题.贴一个代码详解 http://www.cnblogs.com/staginner/archive/2012/02/02/ ...

  2. #425[div2]

    A 签到 #include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll n,k; ci ...

  3. js链表操作

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. mysql更改时区

    set global time_zone = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8区 set time_zone = '+8:00'; ##修改当前会话时区 flu ...

  5. win7 eclipse连接hadoop2.x开发环境搭建

    环境: hadoop-2.3.0-cdh5.1.0 centos 6.5 x64 win7 eclipse4.3 0. 前提条件 ,jdk,maven要安装好. 1.下载hadoop,用winRAR解 ...

  6. <c和指针>学习笔记5动态内存分配和预处理器

    1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...

  7. Spring入门第三十课

    基于XML的方式配置事务 直接看代码: package logan.study.spring.tx.xml; public interface BookShopDao { //根据书号获取书的单价 p ...

  8. HTML代码中<%%>、<%=%>、<%:%>各是什么意思

    运行.获取后台代码或值.<%%>之间可以写服务器端代码,比如<%for(var i=0;i<10;i++){//执行循环体}%> 又如<%for(var i=0;i ...

  9. 对 React Context 的理解以及应用

    在React的官方文档中,Context被归类为高级部分(Advanced),属于React的高级API,但官方并不建议在稳定版的App中使用Context. 很多优秀的React组件都通过Conte ...

  10. 三层登录——VB.NET版

    前言 由于下面的机房收费系统重构自己要用VB.NET进行重构,所以在敲三层登录的时候,实践了一份C#版三层登录,接着就是VB.NET版的三层登录.话说还有七层登录,一下子感觉三层又矮小了.万丈高楼平地 ...