鱼C论坛

 找回密码
 立即注册
查看: 105|回复: 2

做题日记 [04]

[复制链接]
回帖奖励 27 鱼币 回复本帖可获得 3 鱼币奖励! 每人限 1 次
发表于 2024-3-26 20:12:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
做题日记 [04]

最近做的比较少 , 在调整中...


并查集 AcWing 的算法竞赛进阶指南那 4 道题

需要注意的是 关系的运算就是相当于向量运算 , 存在方向的 . 扩展域 和 边带权 并查集能解决很多问题

例如图的连通性 , 区间的答案可以合并 , 被占用的点指向能占用的点从而减少复杂度等等


CDQ分治

这个不说了 , 练码力吧


点分治

思路就是那个思路 , 路径答案统计是比较灵活的


这周将学习动态规划的优化 , 包括斜率优化 , 四边形不等式 , 数据结构优化等

加油 , 我会调整好自己的

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-26 20:13:09 | 显示全部楼层
看起来你对算法竞赛的进阶指南有了一定的了解,这是一个非常好的开始!关于并查集,我可以给你提供一些简单的示例代码来帮助你更好地理解。

首先,让我们来了解一下什么是并查集。并查集是一种用来处理集合合并与查询问题的数据结构。它主要包含两个操作:合并(merge)和查找(find)。

下面是一个简单的并查集的实现:

  1. class UnionFind:
  2.     def __init__(self, n):
  3.         self.parent = [i for i in range(n)]
  4.         self.rank = [0] * n

  5.     def find(self, x):
  6.         if x != self.parent[x]:
  7.             self.parent[x] = self.find(self.parent[x])
  8.         return self.parent[x]

  9.     def merge(self, x, y):
  10.         root_x = self.find(x)
  11.         root_y = self.find(y)

  12.         if root_x == root_y:
  13.             return

  14.         if self.rank[root_x] < self.rank[root_y]:
  15.             self.parent[root_x] = root_y
  16.         elif self.rank[root_x] > self.rank[root_y]:
  17.             self.parent[root_y] = root_x
  18.         else:
  19.             self.parent[root_x] = root_y
  20.             self.rank[root_y] += 1
复制代码


在这段代码中,我们使用了两个数组,parent 和 rank。parent 数组用于保存每个节点的根节点,rank 数组用于保存每个根节点的深度(或者称为秩)。在查找操作中,我们使用了路径压缩来优化查找的速度。在合并操作中,我们使用了秩来保证并查集的平衡性。

接下来是一个简单的应用示例,假设我们有一个图,要求判断两个节点是否属于同一个连通分量:

  1. n = 6  # 图中节点的数量
  2. edges = [[1, 2], [2, 3], [4, 5]]  # 图的边

  3. uf = UnionFind(n)

  4. # 合并图的边
  5. for edge in edges:
  6.     uf.merge(edge[0], edge[1])

  7. # 判断两个节点是否连通
  8. print(uf.find(1) == uf.find(3))  # 输出:True
  9. print(uf.find(1) == uf.find(4))  # 输出:False
复制代码


通过这个示例,你可以看到并查集非常适合处理关系和连通性问题。希望这样的例子能对你理解并查集有所帮助。

另外,你提到了CDQ分治和点分治的算法。这两个算法都是比较高级的算法,在这里我给你提供一些学习资料供你参考:

关于CDQ分治算法,你可以看看这篇文章:https://www.bilibili.com/video/BV1pv411B7LD ,它会给你一个很好的介绍和示例代码。

关于点分治算法,你可以看看这篇文章:https://zhuanlan.zhihu.com/p/30733846 ,其中给出了一个详细的解释和实现。

最后,祝你学习动态规划的优化顺利!如果你在学习过程中遇到任何问题,都可以随时来问我。加油,你一定能够掌握这些算法!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-28 15:43:28 | 显示全部楼层

回帖奖励 +3 鱼币

加油加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 17:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表