1. 程式人生 > >LCT 題目總結

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$ 節點所代表的資訊就是這條鏈上的資訊。