LCT总结

参考

\(LCT\)

\(LCT\)是由\(Splay\)进行维护的,其使用方式非常灵活,因此,要熟练运用\(LCT\),必须对\(Splay\)的结构了如指掌

一些注意点:

\(1.\)对于一个\(Splay\)来说,它维护的是一条链,\(Splay\)的根的父亲为这条链的父亲,而其他节点的父亲为\(Splay\)中的父亲,左儿子为原树中的祖先节点,右儿子为原树中的子孙节点。所以如果\(x\)是一个\(Splay\)的根,那么\(fa(x)=y\)并非连接边\(x-y\),而是连接了这条链的祖先与\(y\)

模板

Luogu3690 【模板】Link Cut Tree (动态树)

Luogu2147 [SDOI2008]洞穴勘测

Luogu3203 [HNOI2010]弹飞绵羊 / CF13E Holes

维护树链信息

主要是数据结构的操作,要有较好的数据结构基础。

注意维护的标记,\(pushdown\)\(update\)不能忘,按照打标记同时更新的原则处理

Luogu1501 [国家集训队]Tree II

Luogu2486 [SDOI2011]染色

Luogu4332 [SHOI2014]三叉神经树

Luogu3703 [SDOI2017]树点涂色

维护边双连通分量

支持连边操作,如果题目给出的是断边操作,可以离线反向处理。

一旦出现双联通分量(连边时发现在同一棵树中的点),直接取出整条链,用一个点代替它,用并查集维护,注意,在\(access\)时要更新\(fa\)

Luogu2542 [AHOI2005] 航线规划

维护边权

把边当成一个点,如边\(a \rightarrow b\),可以用\(a \rightarrow c \rightarrow b\),在\(c\)上记录边权信息,可以借助这一方法维护生成树

Luogu4172 [WC2006]水管局长

Luogu4234 最小差值生成树

Luogu2387 [NOI2014]魔法森林

维护子树信息

同时维护虚、实子节点,新用一个变量记录虚子节点信息,在子节点虚实变换的过程中要更新该变量

注意,由于虚子节点的信息也会对一个节点产生影响,注意要让信息上传至父亲

例:

void link(int x,int y)
{
    makeroot(x);
    access(y);
    splay(y);
    fa(x)=y;
    s2(y)+=s(x);
    update(y);
}

上面的代码中\(access(y),splay(y)\)不可或缺,因为假如不加这句话,更新的只是该节点在它所在的\(Splay\)中的信息,而不能更新该\(Splay\)的祖先的信息,所以先\(access(y),splay(y)\),使\(y\)直接成为从\(x\)\(y\)的链所代表的\(Splay\)的根,就不存在该\(Splay\)的祖先了,这样才可以更新,保证所有的标记能够被需要用的节点利用到(一旦访问到该节点的父节点,父节点一定会被\(Splay\)到根,把该节点\(rotate\)下来,在\(update\)的时候更新信息)

Luogu4219 [BJOI2014]大融合

posted @ 2020-08-13 11:56  GK0328  阅读(130)  评论(0编辑  收藏  举报