题意

输入若干组数据,代表着不同动物在食物链的位置(A,B,C),要求出在输入的过程中有多少组数据会与之前矛盾。

思路(借鉴挑战程序设计竞赛)

这题是学并查集时的题,所以用了并查集。

一开始我想的是,设置三个集合,代表ABC三种等级,再人为地选取开头的几个数字,将它们作为这三个集合的祖先。

数据是两两给出的,只要两个数中其中一个所处集合已知,那就可以根据关系判断出另外一个数应该属于哪个集合,然后以此类推将其它元素加入各个集合中,每次加入前再判断一下它们是否已加入即可。

但是完全有可能有不满足我们前提的数据出现(两个数字都未出现过),那这组数据可能就要延后处理。。。总之越想越麻烦,根据我上一次做题的经验(上次做题的笔记),这肯定是出问题了。。。

于是我就去看书了,结果发现它的解决方案和我上一次有神似之处,这里再赘述一下。

上一道题,题目要将一个方格的中心元素填充为相同的数字,当我们要判断是否到达终点时, 由于事先我们并不知道我们应该往其中填充哪个数字,因此我们不能检测某一个数的数量来判断是否到达终点。

因此一个巧妙的解决方法是更改判断标准——统计中心区域相同元素的最大值,一旦这个值达到了中心区域的格子数,那就说明我们完全任务了。

而对于这题,我们事先并不知道动物们属于哪个等级,那我们可以全部都要!

即对每个动物i,创建三个元素iA,iB,iC(iA表示动物i属于种类A),对所有动物则有3 * N个这种元素,我们对它们建立并查集。 这时,并查集的内容也不是某个动物等级,而是按照题目给出的一系列的关系建立起的一个符合条件(A吃B,B吃C,C吃A)的动物的集合。

这样应该也相当于对每个动物的不同状态进行了一遍枚举,因此每个集合的元素也是独特的,即当一个集合包含iA时,iB或iC的加入则是违法的,并且这样建立起的三个集合,从元素的位置和数量上看是完全对称的(判断时会用到)。

于是我们的方法就是

对于第一种同类操作,给出元素x,y,若符合条件,我们便合并xA-yA, xB-yB, xC-yC。

对于第二种捕食操作,给出元素x,y,若符合条件,我们便合并xA-yB, xB-yC, xC-yA。(再次重申,合并代表两个元素满足所给关系以及与集合内其它元素不发生冲突)

而这里的判断条件其实就是合并的元素的补集,即对第一种操作,在合并xA-yA时,条件应该是xA与yB、yC都不在一个集合内,对于不符合条件的,直接ans++。

那合并xB-yB还要另外设置吗,这里便不需要了,因为各个合并操作都是并行进行的,其中一种的状态便可代表全部三种的状态。(可以手动模拟一下这个过程)

出现的问题

程序(思想)不够精炼

  1. 如何构建给一个动物建立三种副本?我开始想的是x + 50000,x + 2 * 50000,x + 3 * 50000,这样非常浪费空间。正解应该是,x + N,x + 2 * N,x + 3 * N(总感觉后者才是自然的想法)

  2. 条件的判断。我开始没有认识到三种副本之间的对称关系,因此判断条件就比较多,但其实他们都是等价的。

使用并查集之前要初始化,init()

没有这个意识瞪眼看代码怎么也找不着错,找出错来又气又无奈

最后

一篇题解

这篇题解的方法好像和书上的有相通地方,讲的也十分不错,值得多看几回深刻理解 。

种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记的更多相关文章

  1. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  2. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  3. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  4. BZOJ 1370: [Baltic2003]Gang团伙(luogu 1892)(种类并查集)

    题面: bzoj题面有误,还是看luogu的吧 https://www.luogu.org/problemnew/show/P1892 题解: 种类并查集.. 因为有敌人的敌人是朋友这个条件,所以需要 ...

  5. 洛谷 P1892 [BOI2003]团伙(种类并查集)

    传送门 解题思路 用并查集f存朋友关系,一个数组e存的是敌人关系,是一个辅助数组,所以叫做种类并查集. 当p和q是朋友时,直接合并,但是当是敌人时,需要一些操作. 当p还没有敌人时(即p的敌人是自己) ...

  6. NOI2001|POJ1182食物链[种类并查集 向量]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65430   Accepted: 19283 Description ...

  7. A Bug's Life(种类并查集)(也是可以用dfs做)

    http://acm.hdu.edu.cn/showproblem.php?pid=1829   A Bug's Life Time Limit:5000MS     Memory Limit:327 ...

  8. 种类并查集(洛谷P2024食物链)

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

  9. 洛谷 P1525 【关押罪犯】种类并查集

    题解 P1525 [关押罪犯]:种类并查集 前言: 在数据结构并查集中,种类并查集属于扩展域并查集一类. 比较典型的题目就是:食物链(比本题难一些,有三个种类存在) 首先讲一下本题的贪心,这个是必须要 ...

  10. 2-XOR-SAT (种类并查集)

    写了那么多模拟题这题算是最难的了QAQ 好神,,,我于是补了一下并查集.. 并查集很神...... orz 种类并查集...orz 对于维护sat,我们可以这样想: 如果x和y的xor是true,那么 ...

随机推荐

  1. C++课后习题

    一.设计一个类people,有保护数据成员:age(年龄,整型),name(姓名,string),行为成员:两个构造函数(一个默认,另一个带参数):析构函数:void setValue(int m, ...

  2. Django学习day03随堂笔记

    每日测验 """ 今日考题 1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题 2.request ...

  3. django安装DjangoUeditor富文本

    环境: pycharm,django1.11,python2.7 第一种:直接 pip install DjangoUeditor,直接从网上安装到pycharm 由于是直接安装,ueditor.ht ...

  4. redis小结 1-2

    1.Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 c ...

  5. 【HTML】实战阿里云src页面css模仿基础学习

    实战结果页面gif图片 阿里云src首页模仿完整代码(500行左右) <!DOCTYPE html> <html> <head> <meta charset= ...

  6. P7099-[yLOI2020]灼【数学期望,结论】

    正题 题目链接:https://www.luogu.com.cn/problem/P7099 题目大意 给出\(n\)个坐标轴上的点,\(q\)次询问从某点出发每次等概率向左或者向右一格求到达某个给出 ...

  7. P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】

    正题 题目链接:https://www.luogu.com.cn/problem/P4240 题目大意 \(Q\)组数据给出\(n,m\)求 \[\sum_{i=1}^n\sum_{j=1}^m\va ...

  8. truncate表时报“唯一/主键被启用的外部关键字引用”解决办法

    前言:清空表时提示"唯一/主键被启用的外部关键字引用"这一警告信息 原因:是因为主键被子表引用,所以对主键进行更改就好了 解决: 使用 alter table table_name ...

  9. ❤️❤️爆肝3万字整理小白快速入门分布式版本管理软件:Git,图文并茂(建议收藏)--已码一万字❤️❤️

    @ 目录 什么是Git SVN VS Git 什么是版本控制 安装Git 谁在操作? Git本地仓库 本地仓库构造 重点 Git基本操作 git add git commit git diff git ...

  10. 05-IdentityServer4

    前面我们认识了jwt的token颁发模式,其中的应用场景和部分缺陷已经很是了解了.有些场合并不适合jwt,特别是针对第三方进行使用时,比如我们使用qq或者微信登陆博客园或其他第三方应用时. Ids4的 ...