P2024 [NOI2001]食物链[扩展域并查集]
题目来源:洛谷
题目描述
动物王国中有三类动物 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 中
一行,一个整数,表示假话的总数。
输入输出样例
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
3
说明
1 ≤ N ≤ 5 ∗ 10^4
1 ≤ K ≤ 10^5
解析:
好题啊好题啊(啪啪啪)!干了我一天终于出来了。
一开始想用边带权并查集解,发现本蒟蒻想不出来,还是用了扩展域。
这题可以看作 P1525 关押罪犯 的一个延伸拓展题目,具体思路是差不多的。
如果对扩展域有疑问,可以看我以前的一篇题解 P1525 关押罪犯[扩展域并查集],里面有提到扩展域。
思路:
扩展域并查集维护三个域:x_self同类,x_enemy天敌,x_eat捕食。
他们之间的关系:
假设有x,y两个动物,
如果题目给定x和y是同类,那么合并x_self,y_self和x_enemy,y_enemy和x_eat和y_eat。
前提条件是:x_self与y_eat不在同一个集合,x_eat与y_self不在同一个集合。
如果题目给定x吃y,这里我们注意到一点,由于题目给出的食物链关系是环形,因此我们可以由“x吃y”推断出“x的天敌是y的猎物”。
由此得到,合并x_eat,y_self和x_self,y_enemy和x_enemy,y_eat。
前提条件是:x_self和y_self不在一个集合,x_self和y_eat不在一个集合。
参考代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4 #include<cstring> 5 #include<iostream> 6 #define N 50010 7 using namespace std; 8 struct node{ 9 int x,y,flag; 10 }g[N<<4]; 11 int n,k,fa[N<<4]; 12 int get(int x) 13 { 14 if(fa[x]==x) return x; 15 return fa[x]=get(fa[x]); 16 } 17 void merge(int x,int y) 18 { 19 x=get(x),y=get(y); 20 fa[x]=y; 21 } 22 int main() 23 { 24 //freopen("fuc.in","r",stdin); 25 //freopen("fuc.out","w",stdout); 26 int cnt=0; 27 scanf("%d%d",&n,&k); 28 for(int i=1;i<=n*3;i++) fa[i]=i; 29 for(int i=1;i<=k;i++) 30 scanf("%d%d%d",&g[i].flag,&g[i].x,&g[i].y); 31 for(int i=1;i<=k;i++){ 32 if(g[i].x>n||g[i].y>n){ 33 cnt++;continue; 34 } 35 int x_self=g[i].x,x_enemy=g[i].x+n,x_eat=g[i].x+n+n; 36 int y_self=g[i].y,y_enemy=g[i].y+n,y_eat=g[i].y+n+n; 37 if(g[i].flag==1){ 38 if(get(x_eat)==get(y_self)||get(x_self)==get(y_eat)){ 39 cnt++; 40 } 41 else{ 42 merge(x_self,y_self); 43 merge(x_eat,y_eat); 44 merge(x_enemy,y_enemy); 45 } 46 } 47 else{ 48 if(get(x_self)==get(y_self)||get(y_eat)==get(x_self)){ 49 cnt++; 50 } 51 else{ 52 merge(x_self,y_enemy); 53 merge(x_eat,y_self); 54 merge(x_enemy,y_eat); 55 } 56 } 57 } 58 cout<<cnt<<endl; 59 return 0; 60 }
转载于:https://www.cnblogs.com/DarkValkyrie/p/10979331.html
P2024 [NOI2001]食物链[扩展域并查集]相关推荐
- 食物链(扩展域并查集)
题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...
- 并查集 ---- 扩展域并查集判二分图 + 循环模拟字典树 The 2020 ICPC Asia Macau Regional Contest C. Club Assignment (详解)
题目链接 题目大意: 有n个数,现在要把他们拆分成两个集合,假设S为集合,有如下定义: f(S)={min(x⊕y)∣x,y∈S,andx!=y}f(S)=\{min(x\oplus y)|x,y\i ...
- 关押罪犯 扩展域并查集
题目描述 SS S城现有两座监狱,一共关押着NN N名罪犯,编号分别为1−N1-N1−N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用" ...
- Bailian1182 POJ1182 食物链【并查集】
1182:食物链 描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ-1182 食物链(并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 75814 Accepted: 22528 Description ...
- POJ 1182 食物链 (并查集解法)(详细注释)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78510 Accepted: 23396 Description 动物王 ...
- POJ 1182 食物链,并查集的拓展
http://poj.org/problem?id=1182 /******************************************************** 此道题目 前天看的时候 ...
- POJ1182 食物链 —— 种类并查集
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- POJ 1182 食物链(并查集+偏移向量)题解
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82346 Accepted: 24616 Description ...
最新文章
- 美多商城之商品(首页广告)
- 人工智能市场兴起,哪款聊天机器人能提供最好的投资回报?
- HTTP/2笔记之连接建立
- CSS Library
- Android studio3.0打开Device File Explore(文件管理器)的方法(图文教程)
- 快速序列化组件MessagePack介绍
- 前端学习(594):network面板
- new php,PHP: 新特性 - Manual
- linux命令---tar
- java查询和添加客户信息_4.从零点五开始的Java之路(增删改查-客户)
- 苹果就降速门道歉,将 iPhone 电池更换价格下调至 218 元!
- CCNA学习笔记3---备份和升级IOS
- STM32/STM8+DMX512协议
- 科学计算matlab尔雅答案,科学计算与MATLAB语言超星尔雅最新答案大全
- 小和尚打水问题_操作系统进程同步问题解析(哲学家问题、生产消费问题、小和尚打水问题等大量例子)...
- 抖音用什么编程语言_抖音是哪个公司的 抖音app所属公司 是哪个公司开发的
- 各种笔记本进入BIOS的快捷键
- 使用phpword实现php生成word文件同时以邮件的形式发送word附件
- 低功耗 WIFI 门铃在微信小程序中的应用实现(Hi3518EV200+Hi1131s+MCU+LiteOS)
- 在线编辑Word,Excel (WebOffice)
热门文章
- luogu P5338 [TJOI2019]甲苯先生的滚榜
- js时间格式化函数(兼容IOS)
- WCF 第二章 契约 系列文章
- 小评几种O/R Mapping工具
- dict过滤 python_小猿圈解析Python开发的技巧都有哪些?
- python 数学公式显示_ipython jupyter notebook中显示图像和数学公式实例
- android全系统动态二进制分析--CopperDroid
- (26)VHDL实现或(数据流描述)
- (22)FPGA面试技能提升篇(MicroBlaze、PowerPC)
- STM32 利用空闲中断接收数据