“扩展域”与“边带权”的并查集
其实之前并查集题单都做到过,但是并没有针对性的总结为类型题。
1|0引入
并查集擅长维护具有传递性的关系及其连通性。在某些问题中,“传递关系”不止一种,并且这些”传递关系“能够互相导出。此时就可以使用”扩展域“或”边带权“并查集来解决。
2|0[NOI2002] 银河英雄传说
题目描述
杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成 M i j
,含义为第
然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。
在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j
。该指令意思是,询问电脑,杨威利的第
作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。
输入格式
第一行有一个整数
以下有
M i j
: 和 是两个整数( ),表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第 号战舰与第 号战舰不在同一列。C i j
: 和 是两个整数( ),表示指令涉及的战舰编号。该指令是莱因哈特发布的询问指令。
输出格式
依次对输入的每一条指令进行分析和处理:
- 如果是杨威利发布的舰队调动指令,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息。
- 如果是莱因哈特发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第
号战舰与第 号战舰之间布置的战舰数目。如果第 号战舰与第 号战舰当前不在同一列上,则输出 。
样例 #1
样例输入 #1
样例输出 #1
提示
样例解释
战舰位置图:表格中阿拉伯数字表示战舰编号。
2|1边带权并查集
概念
并查集实际上是由若干棵树组成的森林:
- 我们可以在树中的每条边上记录一个权值,即维护一个数组
,用 保存节点 到父节点 之间的边权。 - 在每次路径压缩后,每个访问后的节点都会直接指向树根,如果我们同时更新这些节点的
值,就可以利用路径压缩的过程来统计每个节点到树根之间的路径上的一些信息。
思路
一条“链”也是一棵树,只不过是树的特殊形态。因此可以把每一列战舰看作一个集合,用并查集维护。最初,
在没有路径压缩的情况下,
在考虑路径压缩的情况下,我们额外建立一个数组
当接收到一个
因为此时
当接收到一个
AC代码
3|0[POJ1733] Parity game
小 A 和小 B 在玩一个游戏。
首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。
然后,小 B 向小 A 提出了 M 个问题。
在每个问题中,小 B 指定两个数 l 和 r,小 A 回答
机智的小 B 发现小 A 有可能在撒谎。
例如,小 A 曾经回答过
请你帮助小 B 检查这 M 个答案,并指出在至少多少个回答之后可以确定小 A 一定在撒谎。
即求出一个最小的 k,使得 01 序列 S 满足第
输入格式
第一行包含一个整数 N,表示 01 序列长度。
第二行包含一个整数 M,表示问题数量。
接下来 M 行,每行包含一组问答:两个整数 l 和 r,以及回答 even
或 odd
,用以描述
输出格式
输出一个整数 k,表示 01 序列满足第
数据范围
输入样例:
输出样例:
3|1分析
如果用
中有偶数个 ,等价于 与 奇偶性相同。 中有奇数个 ,等价于 与 奇偶性不同。
注意,这里没有求出
都是给定若干个变量和关系,判定这些关系可满足性的问题。只是本题的传递关系不止一种:
- 若
与 的奇偶性相同, 与 的奇偶性也相同,那么 与 奇偶性相同。这种情况与 P1955 [NOI2015] 程序自动分析 中的等同关系一样。 - 若
与 的奇偶性相同, 与 的奇偶性不相同,那么 与 奇偶性不同。 - 若
与 的奇偶性不同, 与 的奇偶性也不同,那么 与 奇偶性相同。
另外,序列长度
3|2“边带权” 的并查集
- 边权
为 ,表示 与 奇偶性相同。 - 边权
为 ,表示 与 奇偶性不同。
在路径压缩时,对
对于每个问题,设在离散化后
先检查
若
- 已知
与 分别表示路径 与 之间所有边权的异或和,而 之间的边权 是待求的值。 - 显然,路径
由路径 , 与 组成- 因此
与 的奇偶性关系 。 - 进而推出新连接的边权
- 因此
3|3“扩展域” 的并查集
把每个变量
对于每个问题,设在离散化后
- 若
,则合并 与 , 与 。这表示两个信息:- “x为奇数”与“y为奇数”可以互相推出。
- “x为偶数”与“y为偶数”可以互相推出。
- 它们是等价的信息。
- 若
,则合并 与 , 与 。这表示两个信息:- “x为奇数”与“y为偶数”可以互相推出。
- “x为偶数”与“y为奇数”可以互相推出。
- 它们是等价的信息。
上述合并同时还维护了关系的传递性。试想,在处理完
在处理每个问题之前,当然要先检查是否存在矛盾。
- 若两个变量
和 对应的 和 节点在同一集合内,则二者奇偶性应该相同。 - 若两个变量
和 对应的 和 节点在同一集合内,则二者奇偶性应该不同。
4|0P2024 [NOI2001] 食物链
题目描述
动物王国中有三类动物
现有
有人用两种说法对这
- 第一种说法是
1 X Y
,表示 和 是同类。 - 第二种说法是
2 X Y
,表示 吃 。
此人对
- 当前的话与前面的某些真的话冲突,就是假话;
- 当前的话中
或 比 大,就是假话; - 当前的话表示
吃 ,就是假话。
你的任务是根据给定的
输入格式
第一行两个整数,
第二行开始每行一句话(按照题目要求,见样例)
输出格式
一行,一个整数,表示假话的总数。
样例 #1
样例输入 #1
样例输出 #1
提示
对于全部数据,
4|1“扩展域”并查集解法
构造扩展域并查集
把每个动物
- 同类域
- 捕食域
- 天敌域
若一句话说“
的同类与 的同类一样。 捕食的物种与 的捕食的物种一样。 的天敌与 的天敌一样。
此时,我们应合并
若一句话说“
捕食的物种 就是 的同类。 的同类 都是 的天敌。- 又因为题目说食物链是长度为
的环形,所以 的天敌 就是 捕食的物种。
此时,我们应合并
在处理每句话之前,都要检验这句话的真假:
与“
与 在同一集合,说明 吃 。 与 在同一集合,说明 吃 。
与“
与 在同一集合,说明 与 是同类。 与 在同一集合,说明 吃 。
代码实现
5|0更多题目
__EOF__

本文链接:https://www.cnblogs.com/kdlyh/p/17879872.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下