LCT 题目总结

首先,LCT 的概念真的不是很难:
用  $splay$ 维护森林,每棵 $splay$ 的根节点的父亲指向 $splay$ 中
最靠前的点的父亲 ,解释完毕,你应该会了.

当然,只看到这句话还是很难学会的,这就要你去翻阅别人的详细讲解来进一步学习动态树,不过上面的那一句话一定要牢牢记住,因为据笔者经验,很多博客将LCT讲的抽象难懂,所以一定要记住 LCT 是一个十分简单的数据结构.


很多时候他难就难在灵活变换特别多,尤其是总会将LCT森林与原树森林弄混。
这就需要我们多思考一下各种操作过程,让自己思路更加清晰.

我们看几道例题:
1. 比较综合的:
   a.洛谷P3690 【模板】Link Cut Tree (动态树)
   b.洛谷 P1501 [国家集训队]Tree II Link-Cut-Tree
   c.洛谷 P2486 [SDOI2011]染色 LCT
2. 维护连通性
   a.洛谷  P2147 [SDOI2008]洞穴勘测 LCT
   b.洛谷P3950 部落冲突 LCT
3. 动态维护最小生成树
   a. 洛谷 P4180 【模板】严格次小生成树[BJWC2010] LCT
4. 维护子树信息
   a. [BJOI2014]大融合
   b. BZOJ 3637: Query on a tree VI
   c. BZOJ 3639: Query on a tree VII
 
 这里面比较难懂的是维护子树信息和洛谷中动态树的模板。
 (洛谷的模板不保证连边和删边的合法性,简直丧心病狂)
 

我们先看一下洛谷上的 LCT 模板题:
一共给定4种操作,分别为:

0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通
1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接。
2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。
3:后接两个整数(x,y),代表将点x上的权值变成y。

我们依次考虑每种操作
a. 操作0: 由于保证联通,只需提取出 $(x,y)$ 这条链并进行查询即可。
代码很简单:

makeRoot(x), Access(y),splay(y);

$y$ 节点所代表的信息就是这条链上的信息。

 

  

猜你喜欢

转载自www.cnblogs.com/guangheli/p/10159997.html
LCT