前置技能
splay: 必须
树链剖分: 可选,知道树链剖分会容易理解一些。
以下大部分图片来自https://blog.youkuaiyun.com/saramanda/article/details/55253627
Link Cut Tree(LCT)
LCT,又叫林克-卡特树,可以用来解决动态树问题。
LCT显然是一棵树,它长这样:
这上面有一些粗一点的边,我们把它称为重边;还有一些细一点的,我们把它称为轻边。(就像树链剖分的定义)
每个点连向儿子的重边最多只能有1条(可以没有),因此所有的重边能构成树上的一条一条链,叫做重链。
连到重边的儿子叫做嫡长子**重儿子**。
例如上面这个图,1-2-5, 3-7, 4, 6, 8就分别是这棵树的重链。
但是与树链剖分不同的是,LCT中的重边和轻边是可以不断变化的,甚至边/根也可以不断变化,因此我们需要一种灵活一点的数据结构来维护重链,那就是splay啦。
LCT节点的最基本的定义:
struct node
{
node *son[2],*fa;
int rev;
};
splay的维护
一棵splay维护LCT的一条重链,splay维护的关键字是点的深度,一个点深度越浅,在平衡树中的位置就越靠左。</