种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记
题意
输入若干组数据,代表着不同动物在食物链的位置(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还要另外设置吗,这里便不需要了,因为各个合并操作都是并行进行的,其中一种的状态便可代表全部三种的状态。(可以手动模拟一下这个过程)
出现的问题
程序(思想)不够精炼
如何构建给一个动物建立三种副本?我开始想的是x + 50000,x + 2 * 50000,x + 3 * 50000,这样非常浪费空间。正解应该是,x + N,x + 2 * N,x + 3 * N(总感觉后者才是自然的想法)
条件的判断。我开始没有认识到三种副本之间的对称关系,因此判断条件就比较多,但其实他们都是等价的。
使用并查集之前要初始化,init()
没有这个意识瞪眼看代码怎么也找不着错,找出错来又气又无奈
最后
一篇题解
这篇题解的方法好像和书上的有相通地方,讲的也十分不错,值得多看几回深刻理解 。
种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记的更多相关文章
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- BZOJ 1370: [Baltic2003]Gang团伙(luogu 1892)(种类并查集)
题面: bzoj题面有误,还是看luogu的吧 https://www.luogu.org/problemnew/show/P1892 题解: 种类并查集.. 因为有敌人的敌人是朋友这个条件,所以需要 ...
- 洛谷 P1892 [BOI2003]团伙(种类并查集)
传送门 解题思路 用并查集f存朋友关系,一个数组e存的是敌人关系,是一个辅助数组,所以叫做种类并查集. 当p和q是朋友时,直接合并,但是当是敌人时,需要一些操作. 当p还没有敌人时(即p的敌人是自己) ...
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- A Bug's Life(种类并查集)(也是可以用dfs做)
http://acm.hdu.edu.cn/showproblem.php?pid=1829 A Bug's Life Time Limit:5000MS Memory Limit:327 ...
- 种类并查集(洛谷P2024食物链)
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- 洛谷 P1525 【关押罪犯】种类并查集
题解 P1525 [关押罪犯]:种类并查集 前言: 在数据结构并查集中,种类并查集属于扩展域并查集一类. 比较典型的题目就是:食物链(比本题难一些,有三个种类存在) 首先讲一下本题的贪心,这个是必须要 ...
- 2-XOR-SAT (种类并查集)
写了那么多模拟题这题算是最难的了QAQ 好神,,,我于是补了一下并查集.. 并查集很神...... orz 种类并查集...orz 对于维护sat,我们可以这样想: 如果x和y的xor是true,那么 ...
随机推荐
- 【第二篇】- Git 安装配置之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://g ...
- 真香!原来 CLI 开发可以这么简单
CLI(命令行工具,Command Line Interface)大家都非常熟悉了,比如 create-react-app 等.我们今天介绍一个 CLI 工具的开发框架,可以帮助我们快速构建 CLI ...
- Django学习day04随堂笔记
每日测验 """ 今日考题 1.列举你知道的orm数据的增删改查方法 2.表关系如何判定,django orm中如何建立表关系,有什么特点和注意事项 3.请画出完整的dj ...
- prometheus、node_exporter设置开机自启动
方法一.写入rc.local 在/etc/rc.local文件中编辑需要执行的脚本或者命令,我个人习惯用这个,因人而异,有的项目可能需要热加载配置文件,用服务会更好 #普罗米修斯启动,需要后面接con ...
- Kotlin协程入门
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 介绍Kotlin中的协程.用一 ...
- Leetcode 矩阵置零
题目描述(中等难度) 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这 ...
- VS2013的switch case缩进问题
原来的 更改设置 改完后
- requests + 正则表达式 获取 ‘猫眼电影top100’。
使用 进程池Pool 提高爬取数据的速度. 1 # !/usr/bin/python 2 # -*- coding:utf-8 -*- 3 import requests 4 from request ...
- Matlab 速记
链接:https://zhuanlan.zhihu.com/p/370259237 % 1.进度提醒 f = waitbar(0,'1','Name','进度'); set(f,'color','w' ...
- 现在有一个长度20的SET,其中每个对象的内容是随机生成的字符串,请写出遍历删除LIST里面字符串含"2"的对象的代码。
现在有一个长度20的SET,其中每个对象的内容是随机生成的字符串,请写出遍历删除LIST里面字符串含"2"的对象的代码. public class RemoveTwo { //le ...