AC日记——食物链 codevs 1047
1074 食物链
2001年NOI全国竞赛
动物王国中有三类动物 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),输出假话的总数。
第一行是两个整数N和K,以一个空格分隔。
以下K行每行是三个正整数D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。
若D=1,则表示X和Y是同类。
若D=2,则表示X吃Y。
只有一个整数,表示假话的数目。
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
3
输入文件
对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的father数组
i表示与i同类的集合
i+n表示i可以吃的集合
i+n+n表示i+n可以吃且可以吃i的集合
然后每次判断是否是符合已有的真话
不符合ans++
符合就作为一条新的真话
来,上代码:
#include <cstdio>#define maxn 50001 #define maxm 100001using namespace std;class Finding {private:int n,m,f[maxn*3],if_z,ans;char Cget;inline void read_int(int &now_){now_=0,if_z=1,Cget=getchar();while(Cget>'9'||Cget<'0'){if(Cget=='-') if_z=-1;Cget=getchar();}while(Cget>='0'&&Cget<='9'){now_=now_*10+Cget-'0';Cget=getchar();}now_*=if_z;}public:Finding(){read_int(n),read_int(m);for(int i=1;i<=n*3;i++) f[i]=i;int type,x,y;for(int i=1;i<=m;i++){read_int(type),read_int(x),read_int(y);if(x>n||y>n){ans++;continue;}if(type==1){if(If_same(x,y+n)||If_same(x,y+n+n)){ans++;continue;}else{Merge(x,y);Merge(x+n,y+n);Merge(x+n+n,y+n+n);}}else{if(If_same(x,y)||If_same(x+n+n,y)){ans++;continue;}else{Merge(x+n,y);Merge(x+n+n,y+n);Merge(x,y+n+n);}}}printf("%d\n",ans);}int Find(int x){if(x==f[x]) return x;f[x]=Find(f[x]);return f[x];}bool If_same(int x,int y){if(Find(x)==Find(y)) return true;else return false;}void Merge(int x,int y){x=Find(x),y=Find(y);if(x!=y) f[x]=y;} }; class Finding do_;int main() {return 0; }
转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6296597.html
AC日记——食物链 codevs 1047相关推荐
- AC日记——中庸之道 codevs 2021
2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 给定一个长度为N的序列,有Q次 ...
- AC日记——热浪 codevs 1557 (最短路模板题)
1557 热浪 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 德克萨斯纯朴的民眾们这个夏天正在遭 ...
- AC日记——蓬莱山辉夜 codevs 2830
2830 蓬莱山辉夜 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在幻想乡中,蓬莱山辉夜是月球公主,居 ...
- codevs 1047邮票面值设计
codevs 1047邮票面值设计 刚看这题的时候就感觉是搜索,但是分类又是动态规划,就往动态规划那里想,结果就以为是那种一个递推式就出来的一个动态规划,后来写代码交上去发现都是错了,才感觉这里面肯定 ...
- AC日记——约瑟夫问题 codevs 1282
1282 约瑟夫问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 有编号从1到N的N个小朋友在玩 ...
- AC日记——丑数 codevs 1246
1246 丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 对于一给定的素数集合 ...
- AC日记——爱改名的小融 codevs 2967
2967 爱改名的小融 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名. 他的 ...
- AC日记——传染病控制 洛谷 P1041
传染病控制 思路: 题目想问的是: 有一棵树: 对于除1外每个深度可以剪掉一棵子树: 问最后剩下多少节点: 题目意思一简单,这个题立马就变水了: 搜索就能ac: 数据有为链的情况,按深度为层次搜索的话 ...
- AC日记——中位数 洛谷 P1168
题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], -, A[2k - 1]的中位数.[color=red]即[/color] ...
最新文章
- 无广告的pdf阅读器_奥利给!免费无广告!功能超齐全!这样的良心国产软件,真的不多了!...
- [2020多校A层11.18] 三角田地(因式分解)
- 单调队列优化的背包问题
- Linux(debian7)操作基础(十三)之shell脚本同时执行多个应用程序
- 大数据下的精准营销,媒介们将何去何从
- 再谈正态分布或高斯函数
- 95-230-022-源码-WordCount走读-获取JobGraph
- c++突破网关屏蔽_通过API网关实现微服务管控-限流,熔断和降级
- PAT 乙级 1034. 有理数四则运算(20) Java版
- linux安装 web2py,TurnkeyLinux上用于Web2Py到MySQL的DAL连接字符串
- svn sync主从同步学习
- origin函数拟合
- Excel学习笔记3||逻辑函数AND、OR、NOT、XOR、IF、IFS和查找函数VLOOKUP
- 数字孪生典型应用案例
- 李清照(诗词介绍收藏)
- 2011 IT娱乐界回顾
- TF卡里删掉文件后内存没变大_不用第三方,手机自带软件也能清扫内存!教你4个正确清理技巧...
- java判断微信号、手机、名字的正则表达
- chatGPT能生成图片吗-chatGPT如何用
- 字符串前加 u、r、f 的含义
热门文章
- MySql 创建索引原则
- 取MySQL最后几行数据
- linux下signal()函数超详细介绍
- 设计模式:单例模式之懒汉式
- [转]Backup and restore history details
- Enterprise Library 2.0 -- Caching Application Block
- Mybatis3源码分析(05)-加载Configuration-加载MappedStatement
- 阿里巴巴分布式服务框架 Dubbo
- cocos2dx JS 层(Layer)的生命周期
- javascript 变量提前