参考
\(LCT\)
\(LCT\)是由\(Splay\)进行维护的,其使用方式非常灵活,因此,要熟练运用\(LCT\),必须对\(Splay\)的结构了如指掌
模板
Luogu3690 【模板】Link Cut Tree (动态树)
Luogu2147 [SDOI2008]洞穴勘测
Luogu3203 [HNOI2010]弹飞绵羊 / CF13E Holes
维护树链信息
主要是数据结构的操作,要有较好的数据结构基础。
注意维护的标记,\(pushdown\)和\(update\)不能忘,按照打标记同时更新的原则处理
Luogu1501 [国家集训队]Tree II
Luogu2486 [SDOI2011]染色
Luogu4332 [SHOI2014]三叉神经树
维护边双连通分量
支持连边操作,如果题目给出的是断边操作,可以离线反向处理。
一旦出现双联通分量(连边时发现在同一棵树中的点),直接取出整条链,用一个点代替它,用并查集维护,注意,在\(access\)时要更新\(fa\)
Luogu2542 [AHOI2005] 航线规划
维护边权
把边当成一个点,如边\(a \rightarrow b\),可以用\(a \rightarrow c \rightarrow b\),在\(c\)上记录边权信息,可以借助这一方法维护生成树
Luogu4234 最小差值生成树
维护子树信息
同时维护虚、实子节点,新用一个变量记录虚子节点信息,在子节点虚实变换的过程中要更新该变量
注意,由于虚子节点的信息也会对一个节点产生影响,注意要让信息上传至父亲
例:
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]大融合