Luogu2024[NOI2001] 食物链
原题链接: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] 食物链相关推荐
- 并查集/poj1182 noi2001食物链eat
题意 有三类动物A,B,C,题中给出两种关系: 1 x y :x y 同类 2 x y :x吃y 对于假话的定义: 1.当前的话与前面的某些真的话冲突,就是假话: 2.当前的话中X或Y比N大,就是假话 ...
- Noi2001食物链-并查集
Noi2001食物链-并查集 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #incl ...
- 【并查集】noi2001食物链
P2024 [NOI2001]食物链 //这是一道比我年纪大的题啊啊啊啊啊QAQ 加权并查集 三倍并查集好厉害qwq 图源洛谷题解 贴代码qwq 1 #include<cstdio> 2 ...
- P2024 [NOI2001]食物链[扩展域并查集]
题目来源:洛谷 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C ...
- [NOI2001]食物链
https://www.luogu.org/problemnew/show/P2024 题解: https://www.luogu.org/blog/Sooke/solution-p2024 /* * ...
- qt Android 按键事件,QT无窗口状态下对键盘事件的监听
Question:最近在搞linux下的一个客户端项目,需要接收键盘事件,但是又不能有界面,这种情况怎么处理呢? int main(int argc, char *argv[]) { QApplica ...
- 学习笔记——拓展域并查集和带权并查集
1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...
- 算法竞赛进阶指南0x41 并查集
并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询的数据结构.详细地说,并查集包括如下两个基本操作: 1.Get:查询一个元素属于哪一个集合. 2.Merge:把 ...
- 【原创】并查集之扩展域与边带权
[前言] 并查集是一种可以动态维护若干个不重叠的集合,并支持合并于查询的数据结构. 并查集的基本概念很简单,但是这样一种思想的用途十分广泛. 个人理解:这是一种很巧妙的,可以很好的处理对象之间关系的数 ...
- 并查集算法总结专题训练
并查集算法总结&专题训练 1.概述 2.模板 3.例题 1.入门题: 2.与别的算法结合: 3.考思维的题: 4.二维转一维: 5.扩展域并查集&边带权并查集: 4.总结 1.概述 并 ...
最新文章
- [图文] Fedora 28 使用 Virt-Manager 创建 KVM 虚拟机以及 配置 KVM 虚拟机
- 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
- 【网络安全工程师面试合集】——网络安全基础知识大总结
- Sublime功能拓展及插件
- PHP截取文件,[转载]php做截取文件后缀名大全
- 为了永不停机的计算服务 | 凌云时刻
- java 动态爱心代码_java swing实现动态心形图案的代码下载
- 解决window10播放.avi格式视频黑屏,只有声音没有视频0xc00d5212错误
- 软件测试周刊(第12期):程序员在晋升之后会发生什么?
- Oracle中to_date函数用法
- String转int数组
- 找工作经验——EE Master 找CS工作总结
- 将QTextEdit右键菜单设置为中文
- 企业管理软件,真的以业务流程为中心?
- 03 KVM虚拟机镜像制作
- 【5】使用结巴分词对分类语料库分词
- JAVA提高十二:HashMap深入分析
- 设计模式——组合模式(部分整体模式)
- FreeMind思维导图
- Idea 插件SDK 配置
热门文章
- 有关深度估计的几篇文章的阅读笔记
- 非零矩阵A可以写成某个列满秩矩阵与某个行满秩矩阵的乘积
- 1091.二进制矩阵中的最短路径(力扣leetcode) 博主可答疑该问题
- 《Web漏洞防护》读书笔记——第6章,XXE防护
- Codeforces Round #277 (Div. 2) E. LIS of Sequence DP
- 从php的生命周期来优化页面响应时间
- Alpha通道的概念与功能
- 计算机原理考研题库,东北大学计算机组成原理题库(9)
- java取消科学计数法_Jmeter、Java当double显示的数字过长时取消科学计数法显示
- MySQL回滚日志(undo log)总结