种类并查集(维护敌人的敌人是朋友)、并行-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,那么 ...
随机推荐
- vue2.0 前端框架
在正式开始先复习一下js基础.因为vue最通终也要操作这些元素,vue和以前学的js并不挂勾,他和传统的jquert 设计理念相反 ## js 数据类型 1 基本类型 number string ...
- dubbo微服务架构
架构 节点角色说明 调用关系说明 服务容器负责启动,加载,运行服务提供者. 服务提供者在启动时,向注册中心注册自己提供的服务. 服务消费者在启动时,向注册中心订阅自己所需的服务. 注册中心返回服务提供 ...
- redis被360禁止,设置启动
https://blog.csdn.net/blick__winkel/article/details/77986481 一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下 ...
- Jmeter通过正则表达式提取器提取响应结果数据
Jmeter进行接口测试常常会运到一个问题:就是第二个请求如何接收上一个请求响应中的参数.比如,现在个学生金币充值的接口,得先调用登录接口然后从返回里面复制一下sign的值,放到cookie里这样才能 ...
- css 背景图片路径问题
背景图片路径找寻失败问题 1.加~ background-image: url("~@/assets/login/login-bg.png"); background-size: ...
- Centos7创建swap分区
创建4g swap分区 dd if=/dev/zero of=/var/swap bs=1024 count=4194304 mkswap /var/swap 激活swap分区 swapon /var ...
- PolarDB PostgreSQL 架构原理解读
背景 PolarDB PostgreSQL(以下简称PolarDB)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容PostgreSQL与Oracle.PolarDB 的存储与计算能 ...
- CF5E-Bindian Signalizing【单调栈】
正题 题目链接:https://www.luogu.com.cn/problem/CF5E 题目大意 圆上有\(n\)个山,两个山之间可以看到当且仅当它们之间的两条弧中有一条满足所有山都不高于它们两个 ...
- python3之工程中必须依赖的__init__.py
1. __init__.py 1.1 什么是__init__.py 在Python3工程里,当python3检测到一个目录下存在__init__.py文件时,Python3就会把它当成一个模块(m ...
- 使用VisualStudioCode开发Vue
前言 本文主要介绍在VisualStudioCode下开发Vue. Nodejs.Npm.Vue的项目搭建参考下面文章. 用后台开发的逻辑理念学习VUE 在Windows下学习Nodejs.Npm和V ...