题意

输入若干组数据,代表着不同动物在食物链的位置(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. J2EE分布式微服务云开发架构 Spring Cloud+Mybatis+ElementUI 前后端分离J2EE分布式微服务云开发架构 Spring Cloud+Mybatis+ElementUI 前后端分离

    ​ 鸿鹄云架构[系统管理平台]是一个大型企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术(Spring ...

  2. js根据日期获取所在周

    一.获取时间所在周的周一.周五 function getFirstLastDay (time) { let date = new Date(time) let Time = date.getTime( ...

  3. C++ cout格式化输出(输出格式)完全攻略

    使用流操作算子 它们都是在头文件 iomanip 中定义的:要使用这些流操纵算子,必须包含该头文件. 表1:C++ 流操纵算子 流操纵算子 作  用 *dec 以十进制形式输出整数 hex 以十六进制 ...

  4. error: subscripted value is neither array nor pointer问题解决

    在运行程序的时候报错:error: subscripted value is neither array nor pointer 原因分析:下标值不符合数组或指针要求,即操作的对象不允许有下标值. 出 ...

  5. CDI Features inJavaEE 的上下文和依赖注入

    基本的CDI的功能: 类型安全:CDI使用Java类型来解析注入,而不是通过(字符串)名称注入对象.当类型不足时, 可以使用限定符 注释.这允许编译器轻松检测错误,并提供简单的重构. POJO:几乎每 ...

  6. Linux系列(3) - ls

    作用 ls:查询目录中内容 格式 ls [选项] [文件或目录] 选项 描述 -a 显示所有文件,包括隐藏文件.隐藏文件是.开头的 -l 显示详细信息:ls -l简写为ll,使用频率很高 -d 查看目 ...

  7. Shell系列(38)- 数组操作→取值、遍历、替换、删除

    引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...

  8. Django边学边记——中间件

    特点 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,用于全局修改Django的输入或输出. 每个中间件组件负责做一些特定的功能.中间件全部注册在sett ...

  9. python学习笔记(十一)-python程序目录工程化

    在一个程序当中,一般都会包含文件夹:bin.conf.lib.data.logs,以及readme文件. 所写程序存放到各自的文件夹中,如何进行串联? 首先,通过导入文件导入模块方式,引用其他人写好的 ...

  10. SpringBoot 添加本地 jar 文件

    前言 有时候我们在项目中,会用到一些本地 jar 包文件,比如隔壁公司自己打包的: 此时无法从maven远程仓库拉取: 那么我们可以考虑把 jar 文件安装到本地 maven 库中,然后再添加依赖. ...