做题日记 [04]
做题日记最近做的比较少 , 在调整中...
并查集 AcWing 的算法竞赛进阶指南那 4 道题
需要注意的是 关系的运算就是相当于向量运算 , 存在方向的 . 扩展域 和 边带权 并查集能解决很多问题
例如图的连通性 , 区间的答案可以合并 , 被占用的点指向能占用的点从而减少复杂度等等
CDQ分治
这个不说了 , 练码力吧
点分治
思路就是那个思路 , 路径答案统计是比较灵活的
这周将学习动态规划的优化 , 包括斜率优化 , 四边形不等式 , 数据结构优化等
加油 , 我会调整好自己的
看起来你对算法竞赛的进阶指南有了一定的了解,这是一个非常好的开始!关于并查集,我可以给你提供一些简单的示例代码来帮助你更好地理解。
首先,让我们来了解一下什么是并查集。并查集是一种用来处理集合合并与查询问题的数据结构。它主要包含两个操作:合并(merge)和查找(find)。
下面是一个简单的并查集的实现:
class UnionFind:
def __init__(self, n):
self.parent =
self.rank = * n
def find(self, x):
if x != self.parent:
self.parent = self.find(self.parent)
return self.parent
def merge(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x == root_y:
return
if self.rank < self.rank:
self.parent = root_y
elif self.rank > self.rank:
self.parent = root_x
else:
self.parent = root_y
self.rank += 1
在这段代码中,我们使用了两个数组,parent 和 rank。parent 数组用于保存每个节点的根节点,rank 数组用于保存每个根节点的深度(或者称为秩)。在查找操作中,我们使用了路径压缩来优化查找的速度。在合并操作中,我们使用了秩来保证并查集的平衡性。
接下来是一个简单的应用示例,假设我们有一个图,要求判断两个节点是否属于同一个连通分量:
n = 6# 图中节点的数量
edges = [, , ]# 图的边
uf = UnionFind(n)
# 合并图的边
for edge in edges:
uf.merge(edge, edge)
# 判断两个节点是否连通
print(uf.find(1) == uf.find(3))# 输出:True
print(uf.find(1) == uf.find(4))# 输出:False
通过这个示例,你可以看到并查集非常适合处理关系和连通性问题。希望这样的例子能对你理解并查集有所帮助。
另外,你提到了CDQ分治和点分治的算法。这两个算法都是比较高级的算法,在这里我给你提供一些学习资料供你参考:
关于CDQ分治算法,你可以看看这篇文章:https://www.bilibili.com/video/BV1pv411B7LD ,它会给你一个很好的介绍和示例代码。
关于点分治算法,你可以看看这篇文章:https://zhuanlan.zhihu.com/p/30733846 ,其中给出了一个详细的解释和实现。
最后,祝你学习动态规划的优化顺利!如果你在学习过程中遇到任何问题,都可以随时来问我。加油,你一定能够掌握这些算法!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 加油加油 加油{:10_256:}
页:
[1]