题目描述 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)

这道题可以用加权并查集解决。

三个元素集,三个n个元素组成的数组(我放到一个数组里了)。

A---x||y,B---(x||y)+n,C---(x||y)+n*2,

如果x,y同类,则要使A-x<---A-y&&B-x<---B-y&&C-x<---C-y。

如果x吃y,则要使A-x<---B-y&&B-x<---C-y&&C-x<---A-y。

代码实现:

 #include<cstdio>
int n,k,d,x,y,ans;
int v[];
int find(int x){if(v[x]!=x) v[x]=find(v[x]);return v[x];}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=*n;i++) v[i]=i;
for(int i=;i<=k;i++){
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(d==&&x==y)){++ans;continue;}//x和y不能非法,自己不能吃自己。
if(d==){
if(find(x)==find(y+n)||find(x)==find(y+n*)) ++ans;//x和y不能互吃。
else{
v[find(y)]=find(x);
v[find(y+n)]=find(x+n);
v[find(y+n*)]=find(x+n*);
}
}
if(d==){
if(find(x)==find(y)||find(x)==find(y+n*)) ++ans;//x和y不是同类,y也不能吃x。
else{
v[find(y+n)]=find(x);
v[find(y+n*)]=find(x+n);
v[find(y)]=find(x+n*);
}
}
}
printf("%d\n",ans);
return ;
}
注意:有关判断的问题,因为高度有序,所以只需要判断一个条件即可确定某一情况是否存在。

读入输出等优化(codevs 54ms 洛谷62ms):

 #include<cstdio>
#include<string>
using namespace std;
int n,k,d,x,y,ans,l,re;
int ax,bx,cx,ay,by,cy;
int v[];
char ch[];
inline int find(int x){if(v[x]!=x) v[x]=find(v[x]);return v[x];}
int read(){
l=re=;
while(ch[l]=getchar())
if(ch[l]>=''&&ch[l]<='') break;
l++;
while(ch[l]=getchar()){
if(ch[l]>=''&&ch[l]<='') l++;
else break;
}
for(int i=;i<l;i++) re=re*+ch[i]-'';
return re;
}
void write(int x){
l=;
while(x){ch[l++]=x%+'';x/=;}
for(int i=l-;i>=;i--) putchar(ch[i]);
putchar('\n');
}
int main(){
n=read();k=read();
for(int i=;i<=*n;i++) v[i]=i;
for(int i=;i<=k;i++){
d=read();x=read();y=read();
if(x>n||y>n){++ans;continue;}
if(x==y){
if(d==) ++ans;
continue;
}
ax=find(x);bx=find(x+n);cx=find(x+n*);
ay=find(y);by=find(y+n);cy=find(y+n*);
if(d==){
if(ax==by||ax==cy) ++ans;
else{v[ay]=ax;v[by]=bx;v[cy]=cx;}
}
if(d==){
if(ax==ay||ax==cy) ++ans;
else{v[by]=ax;v[cy]=bx;v[ay]=cx;}
}
}
write(ans);
return ;
}

其实这种查找元素是否在同一集合中的题(比如codevs 2597 团伙)都应该考虑一下并查集,并查集代码简单,效率又高,虽然不太容易理解。

题目来源:CODE[VS]

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

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

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

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

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

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

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

  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. 测试神器Swagger的相关使用

    1.Swagger简介 swagger官网地址: https://swagger.io/ swagger官网文档介绍地址: https://swagger.io/about/ ​ swagge是一个易 ...

  2. vue.js学习文档

    1.实例化vue对象 new Vue(){ } 2.对象属性 el: 控制的属性 data: 数据存储位置 methods: 方法存储位置 template: 模板样式 computed: 计算属性 ...

  3. D. Vasya And The Matrix(Educational Codeforces Round 48)

    D. Vasya And The Matrix time limit per test2 seconds memory limit per test256 megabytes inputstandar ...

  4. FFT学习及简单应用(一点点详细)

    什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...

  5. 三分 POJ 2420 A Star not a Tree?

    题目传送门 /* 题意:求费马点 三分:对x轴和y轴求极值,使到每个点的距离和最小 */ #include <cstdio> #include <algorithm> #inc ...

  6. c# 线程浅析(代理 、Invoke、Lock)

    前言:本来想根据自己的经验总结一下c#线程相关的知识点, 写之前看了一些其他人的博客,发现自己也就掌握了不到三分之一....希望通过这次的博客将自己的知识点补充一下,写出更直白的博客和初学者分享. 这 ...

  7. NHibernate3.2学习笔记-几种查询方式

    一.开发环境 数据库:SQLServer2008 编译器:VS2010 .Net版本:.Net Framework 4.0 二.开发过程 1.项目结构 承接上一篇 2.执行sql语句 (1)基本语法 ...

  8. log4j2异步日志解读(二)AsyncLogger

    前文已经讲了log4j2的AsyncAppender的实现[log4j2异步日志解读(一)AsyncAppender],今天我们看看AsyncLogger的实现. 看了这个图,应该很清楚AsyncLo ...

  9. C:\Windows\System32\drivers\etc\hosts文件显示

     attrib -s -h C:\Windows\System32\drivers\etc\hosts 

  10. python的机器学习之路

    2018-04-1712:22:40 这是python依靠计算机视觉进行的ocr手写字的识别. 通过KNN训练数据 kNN 可以说是最简单的监督学习分类器了.想法也很简单,就是找出测试数据在特征空间中 ...