洛谷 P2024:[NOI2001] 食物链 ← 扩展域并查集
【题目来源】https://www.luogu.com.cn/problem/P2024【题目描述】动物王国中有三类动物 ABC这三类动物的食物链构成了有趣的环形。A 吃 BB 吃 CC 吃 A。现有 N 个动物以 1∼N 编号。每个动物都是 ABC 中的一种但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述第一种说法是 1 X Y表示 X 和 Y 是同类。第二种说法是 2 X Y表示 X 吃 Y。此人对 N 个动物用上述两种说法一句接一句地说出 K 句话这 K 句话有的是真的有的是假的。当一句话满足下列三条之一时这句话就是假话否则就是真话。1当前的话与前面的某些真的话冲突就是假话2当前的话中 X 或 Y 比 N 大就是假话3当前的话表示 X 吃 X就是假话。你的任务是根据给定的 N 和 K 句话输出假话的总数。【输入格式】第一行两个整数NK表示有 N 个动物K 句话。第二行开始每行一句话。格式见题目描述与样例。​​​​​​​【输出格式】一行一个整数表示假话的总数。​​​​​​​【输入样例】100 71 101 12 1 22 2 32 3 31 1 32 3 11 5 5【输出样例】3【数据范围】对于全部数据1≤N≤5×10^41≤K≤10^5。∣X∣,∣Y∣2^32。【算法分析】● 基础并查集https://blog.csdn.net/hnjzsyjyj/article/details/146948171int find(int x) { if(x!pre[x]) pre[x]find(pre[x]); return pre[x]; } void merge(int x,int y) { int afind(x); int bfind(y); if(a!b) pre[a]b; } for(int i1; in; i) pre[i]i;● 扩展域并查集https://blog.csdn.net/hnjzsyjyj/article/details/162165317扩展域并查集1扩展域并查集是一种高效处理多关系问题的数据结构通过扩展元素的“逻辑域”来维护复杂关系适用于传统基础并查集无法解决的场景。缺点是需扩展多倍数组空间占用较高。2在扩展域并查集中父数组的大小为 ‌n×k‌其中 ‌n‌ 是元素总数‌k‌ 是每个元素的“逻辑域”数。3扩展域并查集中的“逻辑域”数等于给定问题中互斥关系的种类数”。例如在食物链问题中物种间的关系不是简单的“吃”与“被吃”而是循环依赖如 X 吃 Y、Y 吃 Z、Z 吃 X是一个封闭的循环。在这个循环中每个物种有三种可能的“角色”同类域、食物域、天敌域且这三种角色循环轮替。4为什么必须用“域”来表示并查集仅能判断两个元素是否属于同一连通集合只能描述无向等价关系无法表达单向约束。食物链里 “X 吃 Y” 是单向关系直接用原始动物节点无法区分 “X 吃 Y” 和 “Y 吃 X”。因此需要将同一个动物拆出三类逻辑分身同类域、食物域、天敌域代表该动物在不同捕食关系中的身份通过合并不同动物对应域的分身把单向捕食约束转化为无向集合连通关系用集合归属间接存储整套有向逻辑。5由于食物链的底层逻辑是循环依赖如 X 吃 Y、Y 吃 Z、Z 吃 X故针对动物 i用i表示 i 的同类域 、用in表示 i 的食物域、用i2n表示 i 的天敌域。当声明“X 吃 Y”时本质上是在说X 的食物域 Y 的同类域、X 的天敌域 Y 的食物域、X 的同类域 Y 的天敌域。当声明“X 吃 Y”时其关系代码如下所示。merge(x, y2*n); // X 的同类域 Y 的天敌域 merge(xn, y); // X 的食物域 Y 的同类域 merge(x2*n, yn); // X 的天敌域 Y 的食物域【算法代码】#include bits/stdc.h using namespace std; const int N5e45; int pre[N*3]; int find(int x) { if(x!pre[x]) pre[x]find(pre[x]); return pre[x]; } void merge(int x,int y) { int afind(x); int bfind(y); if(a!b) pre[a]b; } int main() { int n,k,ans0; cinnk; for(int i1; i3*n; i) pre[i]i; while(k--) { int op,x,y; cinopxy; if(xn || yn) { ans; continue; } if(op1) { if(find(x)find(yn) || find(x)find(y2*n)) ans; else { merge(x,y); merge(xn,yn); merge(x2*n,y2*n); } } else { if(find(x)find(y) || find(x)find(yn)) ans; else { merge(x,y2*n); merge(xn,y); merge(x2*n,yn); } } } coutans; return 0; } /* in: 100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5 out: 3 */【参考文献】https://blog.csdn.net/hnjzsyjyj/article/details/162165317https://blog.csdn.net/hnjzsyjyj/article/details/146433179

相关新闻

Postman便携版终极指南:Windows用户的免安装API开发解决方案

Postman便携版终极指南:Windows用户的免安装API开发解决方案

Postman便携版终极指南:Windows用户的免安装API开发解决方案 【免费下载链接】postman-portable 🚀 Postman portable for Windows 项目地址: https://gitcode.com/gh_mirrors/po/postman-portable 你是否曾经因为公司电脑权限限制而无法安装Post…

2026/6/30 22:51:36阅读更多 →
怎么设计客户问卷?在聚合平台用Grok设计高质量满意度问卷的避坑指南与实战对比

怎么设计客户问卷?在聚合平台用Grok设计高质量满意度问卷的避坑指南与实战对比

在做产品运营或市场调研时,设计一份客户满意度问卷看似简单,实则暗藏玄机。问题引导性太强、选项设计不合理、逻辑跳转混乱,都会直接导致收集到的数据失真。最近,不少产品经理和运营人员开始在工具整合站点(yingcaiai.…

2026/6/30 22:51:36阅读更多 →
经典模拟电路(11):电压跟随器(Voltage Follower / Unity-Gain Buffer)完全解读

经典模拟电路(11):电压跟随器(Voltage Follower / Unity-Gain Buffer)完全解读

一、开篇:不放大,却是“万金油”在前面关于运放基础组态的文章中,我们分别拆解了反相放大器和同相放大器。它们都有明确的电压增益:一个反相放大,一个同相放大。按照这个逻辑,你可能会觉得今天要讲的电压跟…

2026/6/30 22:51:36阅读更多 →
Loop Engineering 实操篇:手把手教你写第一个 Loop

Loop Engineering 实操篇:手把手教你写第一个 Loop

Loop Engineering 实操篇:手把手教你写第一个 Loop适合人群:用过 Claude Code 的开发者、想让 AI 自动修 Bug 的效率控、上篇看完想动手的技术人01 先别急,你真需要 Loop 吗上一篇我们聊了 Loop Engineering 是什么。评论区问得最多的一句&am…

2026/6/30 23:46:43阅读更多 →
Redis入门介绍

Redis入门介绍

Redis入门介绍Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存&am…

2026/6/30 23:46:43阅读更多 →
近期零基础做量化,难点不只是代码

近期零基础做量化,难点不只是代码

没有编程或交易经验时,量化看起来像是一整套同时压过来的复杂系统。初学者容易把难点全部归结为不会写代码,却忽略了代码之前还有一个更基础的问题:规则是否已经足够清楚。工具要跟着当前任务走如果一个交易规则本身含糊,后面的技…

2026/6/30 23:46:43阅读更多 →
计算机毕业设计之餐饮管理系统的设计与实现

计算机毕业设计之餐饮管理系统的设计与实现

餐饮管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来,餐饮…

2026/6/30 23:46:43阅读更多 →
【学习记录】Week3(二):栈上狂欢——Shellcode 注入与 jmp esp/call eax 跳转实战

【学习记录】Week3(二):栈上狂欢——Shellcode 注入与 jmp esp/call eax 跳转实战

写在前面:在上一篇中,我们通过 ret2win 成功跳进了程序自带的现成后门。但如果程序里没有后门函数呢?这时候,我们就必须“自带干粮”——把一段机器码(Shellcode)注入到程序的内存中,然后想方设…

2026/6/30 23:46:43阅读更多 →
链路追踪——微服务的“行车记录仪“

链路追踪——微服务的“行车记录仪“

第337篇:链路追踪——微服务的"行车记录仪" 你有没有用过滴滴打车? 生活场景:滴滴打车的追踪 你叫了一辆车: 你看到:司机在哪里、距离你多远、预计多久到 司机看到:你的位置、目的地、导航路线 平台看到:整条链路的状态 如果出了问题: 你打电话给客服:“…

2026/6/30 23:41:43阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时,很多人会被它复杂的界面吓到。其实只要掌握几个核心区域,就能快速上手。我最开始用PPT时,经常找不到功能按钮在哪,后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时,我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果,但按错了就可能坠机。经过多年实战,我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →