动态点分治

本文深入浅出地讲解了点分治与动态点分治的基本原理。从寻找树的重心开始,逐步介绍如何通过递归将问题规模缩小,并讨论如何在动态过程中维护答案。适合有一定算法基础的同学阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感觉动态点分治一直没有太懂呀。
一定是我太菜了

点分治还是很简单的:
每次找出当前树的重心
把树至少缩小一半
然后暴力把当前的子树上的所有的可能值全部算出来
只需要容斥的算一下重复的部分就行了

动态点分治
似乎代码就比点分治多了一行:
把点分治的树按照重心割开之后
只需要记录一下它在分治树的父亲是谁
分治树高保证是O(logn)级别的
(每次都把树的大小至少除了二,这是重心的性质)

这个时候的这棵树
虽然不能够直接当原树来搞
但是相当于每次都是一棵子树
点还是没有变的
所以,只需要考虑当前点对于他所在重心块,以及他们的父亲
向上做出的贡献就行了

这里我想了很久才弄懂:
再详细点解释:

点分治:每次割完重心之后,我这棵子树的点反正没有变化
现在我询问的东西不是边权
而和点有关系
因此,只需要暴力计算一下当前子树的答案就行了
子树是一样的,只是指定的根节点不一样罢了

动态点分治:
相当于在上面再进一步
我既然每次只需要考虑在当前点所在的块对上面的贡献
所以,动态的维护一下要求的东西
来计算对于上面的贡献即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值