學習LCT小結

2022-07-24 09:57:10 字數 2660 閱讀 8642

話說前面部分大概是我一年前搞的吧。

最近又複習了一哈lct,那就補補坑吧。

注意,為了區分,從我寫spaly開始都是現在寫的。

lct即自動細胞學檢測系統,又稱液基細胞學檢測系統。是宮頸篩查的一種方法。

疏鬆結締組織(loose connective tissue)又稱蜂窩組織(areolar tissue),其特點是細胞種類較多,纖維較少,排列稀疏。疏鬆結締組織在體內廣泛分布,位於器官之間、組織之間以至細胞之間,起連線、支援、營養、防禦、保護和創傷修復等功能。

好吧,不是這個。

lct即為link-cut-tree

是一種解決動態樹的有效利器。

動態樹是一類問題,常見的有維護樹的連通性,求樹上路徑的極值等。

然後lct即為一種用splay來維護樹鏈剖分的演算法,簡單理解為「支援刪邊、加邊的動態樹鏈剖分」

樹鏈剖分

(不會的可以看看我寫的)

splay

(不會的可以看看不是我寫的)

重點是樹鏈剖分的全部內容加上splay的一些基本操作(如標記下傳、區間翻轉《排序機械臂》)

lct的本質也是樹鏈剖分,它的樹也是用很多的偏愛路徑和非偏愛路徑來連線起來的。

這些為了方便理解,不妨也用樹鏈剖分的定義來定義。

1、重邊連起來會組成重鏈,重鏈之間沒有公共點。

我們首先跑一遍算出dfn序之後,我們就可以找到很多很多條重鏈。

2、那麼對於一顆樹,其中一條重鏈的點,都在一顆splay中,關鍵字是深度。

3、樹鏈剖分的重鏈是一成不變的,但是lct的重鏈是可以隨意改變的。這也注定了lct的重鏈需要用到splay來維護。

4、重鏈與重鏈之間的邊在splay中用虛邊來表示。

5、一條重鏈的虛邊會存在它的splay的根上,指向這條重鏈的頂點的father所在的重鏈的splay的根。

就是這麼多啦。

其實這樣子很難理解4與5的定義什麼意思,那麼我們畫畫圖。

上面加粗的邊即為重邊,然後連成重鏈。

然後,我們把每一條重鏈都給弄出來,對它建一顆splay,那麼就變成——

那麼對於上面的這個圖,三角形就代表乙個splay,每個splay對應著lct上的每個鏈。

那麼有些鏈是用一條輕邊連起來的,那麼在splay上就用乙個虛邊連線。

理解定義5,就會發現在這張圖上,這些有向邊可以表示為虛邊。

然後就大致介紹完lct的基本定義與構造了。

由於我們的這個lct並不需要把它建出來,只需要維護spaly即可。

因此,我們節點維護下面的一些基本值:

其實spaly在lct中只需要利用其旋轉,就可以基本完成一切操作(廢話)

那麼在旋轉過程中,需要改進的只有乙個向虛邊傳送。

**

void rotate(int x)

我們定義乙個操作\(access(x)\)表示把當前x到根的所有邊都變成重邊,然後把這條鏈以外的所以邊變成輕邊。

具體操作看圖:

(盜盜圖)

應該很好理解。

**:

void access(int x)

}

我們定義乙個操作\(makeroots(x)\)表示把x變成lct的根。

操作簡單,先access一下,那麼我們就可以得到一顆spaly。

然鵝這顆spaly最右邊的點是x,我們要把他變成最左邊。

於是把它旋轉到根,翻轉一下即可(翻轉就是排序機械臂中的翻轉)

**:

void make(int x)

void makeroot(int x)

我們定義乙個操作\(findroots(x)\)表示尋找x所在樹的root。

這個操作有什麼用呢?

你可以用這個代替並查集,只是時間多了些

用醋很多,就不一一介紹了。

如何實現?

access(x)一下,然後我們發現x和原本的根在同一spaly上。

然後詢問spaly上最左邊的點即可。

int findroot(int x)

這個就很帥氣了。

我們定義乙個操作\(link(x,y)\)表示連線x和y這條邊。

方法很簡單,我們先makeroot(x),然後把x連線到y即可。

void link(int x,int y)

我們定義乙個操作\(cut(x,y)\)表示刪掉x和y這條邊。

我們考慮makeroot(x),然後access(y)。

如果x和y之間有連邊,那麼y必定是x的兒子。

斷掉即可。

void cut(int x,int y)

大致就是上面的這些操作。

例題?洛谷上很多。

當然,這也是乙個模板。

LCT 學習筆記

自己定的學習計畫看起來完不成了 兩天沒學東西,全在補題 決定趕快學點東西 於是就學lct了 link cut tree是一種資料結構,我們用它解決動態樹問題 但是lct不叫動態樹,動態樹是指一類問題 那麼lct的中文名是啥啊 這是 個和 splay 樣只需要寫幾 yi 個 dui 核心函式就能實現一...

LCT 學習筆記

可能叫動態鏈剖分會比較合適?回顧重鏈剖分,我們將 x 所有兒子中子樹 siz 最大的那個兒子欽定為重兒子,乙個結點與它的重兒子的連邊稱為重邊,其餘稱為輕邊。重邊和輕邊形成的鏈把整棵樹剖分成了若干個 dfs 序上的連續段,這樣我們就能使用諸如線段樹等靜態資料結構維護鏈上的資訊了。重剖的侷限性在於它所維...

專題學習 LCT

等下發樹剖的學習筆記 lct link cut tree 是解決一類動態樹問題的資料結構 主要是給乙個有根樹的森林,然後有動態插入邊,刪除邊,詢問等操作 保證時刻是乙個森林 lct維護子樹資訊比較麻煩,這裡暫時不提 一 實邊和虛邊 lct 會將兒子劃分為虛 實兩種兒子,相應的邊稱為虛邊或實邊,且任意...