【总结】带权并查集
原理
令
p
[
x
]
p[x]
p[x]表示
x
x
x到
f
a
[
x
]
fa[x]
fa[x]的路径权值,有下式:
s
[
x
]
=
p
[
x
]
+
s
[
f
a
[
x
]
]
s[x]=p[x]+s[fa[x]]
s[x]=p[x]+s[fa[x]]
可以在路径压缩时完成这一点,这类题的关键是求出两个根节点
u
,
v
u,v
u,v的关系(即求
s
[
u
]
s[u]
s[u],默认
v
v
v为新的根节点)
A. 箱子
有n个箱子,初始时每个箱子单独为一列;
接下来有p行输入,M, x, y 或者 C, x;
对于M,x,y:表示将x箱子所在的一列箱子搬到y所在的一列箱子上;
对于C,x:表示求箱子x下面有多少个箱子;
分析:
- 求深度一定是累加,跑一次后就链接到根节点了(路径压缩的特性,本身路径长度会改变,只是点的权值不会变),根节点权值为0,故不会影响结果。如果累加式出现了常数,多次调用时一定会越加越大。
- 这道题可以直接根节点相连,虽然路径并非直接连在一起,但将路径累加在权值上即可
- 权值可以记录一些路径压缩下改变的东西,这就是它的用处
B.食物链
分析:用带权并查集
x到根节点root的路径权值s[x]就表示了x与root的关系。若x,y在同一集合中,则s[x]和s[y]的差就是x,y的关系。
可以用0,1,2表示不同的种类,由于构成一个环,所以可以模3解决。
另外:s[x,y]=s[x,z]+s[z,y],显然可以用路径压缩。
对于x,y的根节点u,v,要合并u,v两颗树,只需要:
f
a
[
u
]
=
v
;
fa[u]=v;
fa[u]=v;
s
[
u
]
=
(
t
y
p
d
−
1
−
s
[
x
]
+
s
[
y
]
+
3
)
m
o
d
3
;
s[u]=(typd-1-s[x]+s[y]+3) mod 3;
s[u]=(typd−1−s[x]+s[y]+3)mod3;
式二可以用向量证明,不过感性理解即可。
注意并查集只能合并根节点,x,y,是不能动的。其实把u接到y后面也没错。
C.有多少答案是错误的
题目描述
现在有n个数(1~n)和m次询问,每次询问给出一个区间[a,b]以及这个区间内的价值总和,现在请你找出给出的m次查询中,有多少个询问是和前面不相互矛盾的已存在的询问相互矛盾。
输入格式
第一行包含两个整数n,m(1<=n<=200000, 1<=m<=40000),表示数据的范围以及查询的次数。
接下来每行3个数字a,b,s,表示区间[a,b]内的价值总和为s。其中0<a<=b<=n。
题目保证所有数据的s的和在int范围内。
ps:因为老师们只是讲了思路,所以我来说明一下具体怎么实现
分析:
首先,本题要明确:一个区间的和可能是负的,所以只有根据前面题目中给出的点找矛盾,如:
1 10 10
4 6 50
这个样例是正确的
本题的处理方法和上题一样:
f
a
[
u
]
=
v
;
fa[u]=v;
fa[u]=v;
s
u
m
[
u
]
=
s
−
s
u
m
[
x
]
+
s
u
m
[
y
]
;
sum[u]=s-sum[x]+sum[y];
sum[u]=s−sum[x]+sum[y];
总结:这三道题展现了并查集问题的相似性,它不但可以维护关系,还可以维护数值,实现集合内任意两点间路径的查询。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530431.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」