点分树——动态点分治

前置芝士:树上点分治

进入正题

啥是点分树?

顾名思义,它和点分治密切相关,实际上,点分树就是将点分治时的重心相连,所构成的一棵树。

举个栗子,比如说有这么一棵树:
在这里插入图片描述
那么它的点分树就是这样的:
在这里插入图片描述
因为有时候某些树的重心不唯一,所以点分树的形态也各异,但这都不影响对他的使用。

点分树の用处

引子

看下面这道题:

给一棵n个点的树,所有边的权都为1,问图中距离为k的点对数量

简单~,点分治模板题嘛。

不过……要是带上了修改呢?

正题

题目进阶:

给一棵n个点的树,以及一个固定的k,所有边的权都为1,每个点有黑白两色,一开始全是白点,接下来有m个操作。第一种操作,询问图中距离为k的白点对数量;第二种操作,将点x的颜色修改(黑变白,白变黑)。

(接下来是给读者的思考时间~)
……
……
……
……

emm……貌似点分治做不了呀。

这个时候就要用到神奇的点分树了!

考虑一个重心, x x x在它的子树内, x x x的深度为 d e e p [ x ] deep[x] deep[x](在该子树内),那么 x x x对于该重心能产生的贡献就是深度为 k − d e e p [ x ] k-deep[x] kdeep[x]的点的数量(当然要减掉x所在的那棵子树内的点)。显然,预处理一下,是可以 O ( 1 ) O(1) O(1)求出贡献的。于是,当每次修改某个点的颜色时,只需要从这个点开始,沿着点分树一路往上跑,沿途更新答案即可。

因为树上点分治的分治层数保证不超过 l o g ( n ) log(n) log(n)层,所以点分树的深度也不会超过 l o g ( n ) log(n) log(n),所以,每一次的修改就是 l o g ( n ) log(n) log(n)的。

题表

以后可能还会更新?

震波   题解
[ZJOI2007]捉迷藏   题解

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值