很愚昧的以为动态树是一种数据结构,现在才知道动态树是是一类问题(Dynamic Tree Problems)。
spoj上有一系列关于树的很有趣的题目(qtree1~4),和树链剖分、动态树有关,所以就狠下心的研究了一番,多亏找到了一篇好论文《qtree解法的一些研究 by yangzhe》,解决动态树问题的数据结构叫link-cut tree(又是tarjan发明的,无限崇拜!!),看懂了思想以后便抱着视死如归的心态编了起来(拿hnoi2010的bounce来练手),因为看了标程,7kb、8kb、7kb,=、=。
首先说说树链剖分,差不多就是link-cut tree 的静态版(静态树!?),前提是树的形状不发生改变。树中的重边的定义就是每个点向他最大的儿子(子树大小最大)连的边,其他的边就是轻边。可以证明一个点到根节点经过的轻边数不超过logN,证明:
定义size(i)为以i为根的子树大小,
若 i 和 fa(i) 之间连的是轻边
也就是 存在 j∈son(fa(i)),size(j)≥size(i)
又∵ size(fa(i))≥size(i)+size(j),
∴size(fa(i))>2*size(i).
每走一条轻边节点数都会增大一倍,那当然不可能超过logN条轻边咯。
对于一串连续的重边,我们就把它压缩为一条重路径。
如果这棵