点分治
看来是非学不可了
前言
到目前为止,我们用数据结构处理的大多是序列上的问题。这些问题的形式一般是给定序列中的两个位置
点分治
静态点分治
考虑一个抽象问题:统计树上满足某个条件的路径个数
我们先给这个树随机选一个根,若指定节点
- 经过根节点
。 - 包含于
的某一棵子树中(不经过根节点)。
根据分治的思想,对于第 2 类路径,显然可以把
而对于第 1 类路径,可以从根节点
那么这就形成了一个分治结构。
如果我们每次枚举根,并且分治的时候把根去掉,分治剩下的几个子树,那么这种分治方法就叫点分治
点分治的基本思路:
-
寻找一个点当做当前树的根
- 一般使用树的重心
-
计算跨过这个根的路径数量或其他信息
- 一般对一棵子树,先用其中的节点作为路径终点,统计其他子树对其中节点的贡献
- 然后计算当前子树对其他子树的贡献,修改数据结构。
- 按存边顺序处理,一个子树统计答案时只有前面的子树对它有贡献,避免算重。(前提是路径起点终点是等价的)
-
分治递归计算当前根的子树的贡献
- 那么不难发现这样就可以统计到所有的路径因为任何一个路径都会在某一次被分到根两棵子树里(或在当前根和子树内),就一定经过了根,会被统计上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】