240. 食物链
题目链接
240. 食物链
动物王国中有三类动物 ,这三类动物的食物链构成了有趣的环形。
吃 , 吃 , 吃 。
现有 个动物,以 编号。
每个动物都是 中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这 个动物所构成的食物链关系进行描述:
第一种说法是 1 X Y
,表示 和 是同类。
第二种说法是 2 X Y
,表示 吃 。
此人对 个动物,用上述两种说法,一句接一句地说出 句话,这 句话有的是真的,有的是假的。
当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
- 当前的话与前面的某些真的话冲突,就是假话;
- 当前的话中 或 比 大,就是假话;
- 当前的话表示 吃 ,就是假话。
你的任务是根据给定的 和 句话,输出假话的总数。
输入格式
第一行是两个整数 和 ,以一个空格分隔。
以下 行每行是三个正整数 ,两数之间用一个空格隔开,其中 表示说法的种类。
若 ,则表示 和 是同类。
若 ,则表示 吃 。
输出格式
只有一个整数,表示假话的数目。
数据范围
,
输入样例:
输出样例:
解题思路
扩展域并查集
对于一个点可以拆分为三类:同类、天敌类、捕食类,这三种关系都是互斥的关系,即对于 来说,把与 同类的放在一个集合,天敌类放在一个集合,捕食类放在一个集合,现在并查集主要维护这些信息,即对于 来说,如果 和 属于同一类,则将 和 的同类、天敌类、捕食类分别放在一个集合里面,否则如果 吃 ,则分别将将 的捕食类跟 , 的天敌类和 的捕食类, 和 的天敌类放在一个集合里
另外,判断出现矛盾的情况:
-
和 属于同一类
-
- 吃
-
- 吃
-
吃
-
- 和 属于同一类
-
- 吃
-
时间复杂度:
带边权并查集
对于 ,考虑定义并查集树边权,如果 是 的父亲节点,说明 可以吃 ,判断 跟并查集树根节点 的关系,如果 到根节点 的距离 说明 和 是同类,如果 说明 吃 ,否则说明 吃
所以并查集合并时要维护这样的信息,当合并时,只需要将需要变化的值加在根节点变化的根节点上,下次查询时所有的 都要加上这样的变化值,注意路径压缩时,当一个根节点被赋予值时,说明树中的所有 都要加上该变化值,故 应该加上的是 而不是直接
另外:取模可能会出现负数,即不一定有 等价于 ,因为负数取模是先取模再加上负号
- 时间复杂度:
代码
- 扩展域并查集
- 带边权并查集
__EOF__

本文链接:https://www.cnblogs.com/zyyun/p/16935515.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!