点分树——动态点分治

前置芝士:树上点分治

进入正题

啥是点分树?

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

举个栗子,比如说有这么一棵树:
点分树——动态点分治_第1张图片
那么它的点分树就是这样的:
点分树——动态点分治_第2张图片
因为有时候某些树的重心不唯一,所以点分树的形态也各异,但这都不影响对他的使用。

点分树の用处

引子

看下面这道题:

给一棵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]捉迷藏   题解

你可能感兴趣的:(#,数据结构)