原题链接:https://www.luogu.org/problemnew/show/P2024

食物链

题目描述

动物王国中有三类动物A,B,CA,B,CA,B,C,这三类动物的食物链构成了有趣的环形。AAA吃BBB,BBB吃CCC,CCC吃AAA。

现有NNN个动物,以1-N1 - N1-N编号。每个动物都是A,B,CA,B,CA,B,C中的一种,但是我们并不知道它到底是哪一种。

有人用两种说法对这NNN个动物所构成的食物链关系进行描述:

第一种说法是“1XY1\ X\ Y1 X Y”,表示XXX和YYY是同类。

第二种说法是“2XY2\ X\ Y2 X Y”,表示XXX吃YYY 。

此人对NNN个动物,用上述两种说法,一句接一句地说出KKK句话,这KKK句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

• 当前的话与前面的某些真的话冲突,就是假话

• 当前的话中XXX或YYY比NNN大,就是假话

• 当前的话表示XXX吃XXX,就是假话

你的任务是根据给定的NNN和KKK句话,输出假话的总数。

输入输出格式
输入格式:

从 eat.in 中输入数据

第一行两个整数,N,KN,KN,K,表示有NNN个动物,KKK句话。

第二行开始每行一句话(按照题目要求,见样例)

输出格式:

输出到 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∗1041 ≤ N ≤ 5 ∗ 10^41≤N≤5∗104
1≤K≤1051 ≤ K ≤ 10^51≤K≤105

题解

跟关押罪犯类似,不过不能开数组记天敌、猎物,我们开三倍点,x+nx+nx+n表示猎物,x+2×nx+2\times nx+2×n表示天敌,其他的按照题意合并即可。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=1.5*1e5+5;
int f[M],n,m,ans;
int root(int v){return f[v]==v?v:f[v]=root(f[v]);}
void in(){scanf("%d%d",&n,&m);}
bool same(int x,int y){return root(x)==root(y);}
int merge(int x,int y){f[root(x)]=root(y);}
void ac()
{for(int i=3*n;i>=1;--i)f[i]=i;for(int i=1,op,x,y;i<=m;++i){scanf("%d%d%d",&op,&x,&y);if(x>n||y>n){++ans;continue;}if(op==1)(!same(x,y+2*n)&&!same(x,y+n))?merge(x,y),merge(x+n,y+n),merge(x+2*n,y+2*n):++ans;else{if(x==y){++ans;continue;}(!same(x,y)&&!same(x,y+n))?merge(x,y+2*n),merge(y,x+n),merge(y+n,x+2*n):++ans;}}printf("%d",ans);
}
int main(){in(),ac();}

Luogu2024[NOI2001] 食物链相关推荐

  1. 并查集/poj1182 noi2001食物链eat

    题意 有三类动物A,B,C,题中给出两种关系: 1 x y :x y 同类 2 x y :x吃y 对于假话的定义: 1.当前的话与前面的某些真的话冲突,就是假话: 2.当前的话中X或Y比N大,就是假话 ...

  2. Noi2001食物链-并查集

    Noi2001食物链-并查集 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #incl ...

  3. 【并查集】noi2001食物链

    P2024 [NOI2001]食物链 //这是一道比我年纪大的题啊啊啊啊啊QAQ 加权并查集  三倍并查集好厉害qwq 图源洛谷题解 贴代码qwq 1 #include<cstdio> 2 ...

  4. P2024 [NOI2001]食物链[扩展域并查集]

    题目来源:洛谷 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C ...

  5. [NOI2001]食物链

    https://www.luogu.org/problemnew/show/P2024 题解: https://www.luogu.org/blog/Sooke/solution-p2024 /* * ...

  6. qt Android 按键事件,QT无窗口状态下对键盘事件的监听

    Question:最近在搞linux下的一个客户端项目,需要接收键盘事件,但是又不能有界面,这种情况怎么处理呢? int main(int argc, char *argv[]) { QApplica ...

  7. 学习笔记——拓展域并查集和带权并查集

    1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...

  8. 算法竞赛进阶指南0x41 并查集

    并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询的数据结构.详细地说,并查集包括如下两个基本操作: 1.Get:查询一个元素属于哪一个集合. 2.Merge:把 ...

  9. 【原创】并查集之扩展域与边带权

    [前言] 并查集是一种可以动态维护若干个不重叠的集合,并支持合并于查询的数据结构. 并查集的基本概念很简单,但是这样一种思想的用途十分广泛. 个人理解:这是一种很巧妙的,可以很好的处理对象之间关系的数 ...

  10. 并查集算法总结专题训练

    并查集算法总结&专题训练 1.概述 2.模板 3.例题 1.入门题: 2.与别的算法结合: 3.考思维的题: 4.二维转一维: 5.扩展域并查集&边带权并查集: 4.总结 1.概述 并 ...

最新文章

  1. [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
  2. 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
  3. 【网络安全工程师面试合集】——网络安全基础知识大总结
  4. Sublime功能拓展及插件
  5. PHP截取文件,[转载]php做截取文件后缀名大全
  6. 为了永不停机的计算服务 | 凌云时刻
  7. java 动态爱心代码_java swing实现动态心形图案的代码下载
  8. 解决window10播放.avi格式视频黑屏,只有声音没有视频0xc00d5212错误
  9. 软件测试周刊(第12期):程序员在晋升之后会发生什么?
  10. Oracle中to_date函数用法
  11. String转int数组
  12. 找工作经验——EE Master 找CS工作总结
  13. 将QTextEdit右键菜单设置为中文
  14. 企业管理软件,真的以业务流程为中心?
  15. 03 KVM虚拟机镜像制作
  16. 【5】使用结巴分词对分类语料库分词
  17. JAVA提高十二:HashMap深入分析
  18. 设计模式——组合模式(部分整体模式)
  19. FreeMind思维导图
  20. Idea 插件SDK 配置

热门文章

  1. 有关深度估计的几篇文章的阅读笔记
  2. 非零矩阵A可以写成某个列满秩矩阵与某个行满秩矩阵的乘积
  3. 1091.二进制矩阵中的最短路径(力扣leetcode) 博主可答疑该问题
  4. 《Web漏洞防护》读书笔记——第6章,XXE防护
  5. Codeforces Round #277 (Div. 2) E. LIS of Sequence DP
  6. 从php的生命周期来优化页面响应时间
  7. Alpha通道的概念与功能
  8. 计算机原理考研题库,东北大学计算机组成原理题库(9)
  9. java取消科学计数法_Jmeter、Java当double显示的数字过长时取消科学计数法显示
  10. MySQL回滚日志(undo log)总结