[轉]LCT講解

引子

—–摘自PoPoQQQ&&優秀的學姐

『LCT能幹嘛』

(1)維護一個序列,支持下列操作:
區間求和
區間求最值
區間修改
求連續子段和
這個線段樹就可以解決 具體做法不加累述了
(2)維護一個序列,支持下列操作:
區間求和
區間求最值
區間修改
求連續子段和
添加一段區間
刪除一段區間
翻轉一段區間
Splay的基本操作
(3)維護一棵樹,支持下列操作:
鏈上求和
鏈上求最值
鏈上修改
子樹修改
子樹求和
樹鏈剖分!!!
(4)維護一棵樹,支持下列操作:
鏈上求和
鏈上求最值
鏈上修改
斷開樹上的一條邊
連接兩個點,保證連接後仍然是一棵樹
由於樹是動態的,我們不能每次操作都重標號一遍 樹鏈剖分搞不了了
然而我們可以沿用樹鏈剖分的輕重鏈剖分的概念
既然是動態那麼我們肯定要把靜態的線段樹換成動態的Splay
於是就有LCT≈樹鏈剖分+Splay

『引入一些概念』

Preferred Child:重兒子,重兒子與父親節點同在一棵Splay中,一個節點最多只能有一個重兒子
Preferred Edge:重邊,連接父親節點和重兒子的邊
Preferred Path:重鏈,由重邊及重邊連接的節點構成的鏈

『Auxiliary Tree(輔助樹)』

由一條重鏈上的所有節點所構成的Splay稱作這條鏈的輔助樹
每個點的鍵值爲這個點的深度
輔助樹的根節點的父親指向鏈頂的父親節點,然而鏈頂的父親節點的兒子並不指向輔助樹的根節點
(兒子認爹&&爹不認兒子)
原樹中的重鏈 -> 輔助樹中兩個節點位於同一棵Splay中
原樹中的輕鏈 -> 輔助樹中子節點所在Splay的根節點的father指向其父節點
注意原樹與輔助樹的結構並不相同

那麼切入正題咯

 

那麼LCT中最重要的操作可以說是….

『Access操作』

目的:將x的重邊切斷,並將x到根的路徑上所有的邊都搞成重邊。
具體實現:根據輔助樹按照深度爲關鍵字的性質。不斷地將一個結點的父親轉到根,然後把這個結點接到它父親的右兒子,此時要切斷x下面的所有重邊


『Reverse操作』

目的:將原樹中的x結點轉到根。
具體實現:因爲原樹是虛樹,所以在原樹中進行變換實際上是在輔助樹中進行變換。首先Access一個點,再將這個點在輔助樹中轉到根。又是根據輔助樹按照深度爲關鍵字的性質,將這個點所在的splay樹反轉,實際上改變了深度的關係,也就是實現的原樹的換根。



那麼知道這兩個之後其他的都是小菜咯

『Link操作』

目的:將兩個不連通的點連通。換句話來說,合併或扔到一顆樹裏。
具體實現:首先進行Reverse操作,在原樹中將一個點轉到那個點所在的樹的根。然後將這個轉到根的點的father接到另外一個點上。可以進行一次splay來update。

『Cut操作』

目的:將兩個連通的點不連通,換句話說,把一棵樹拆成兩棵樹。
具體實現:首先進行Reverse操作,在原樹中將一個點轉到那個點所在的樹的根。然後Access另外一個點,把另外一個點在輔助樹中轉到根。由於這兩個點原先是連通的,那麼進行Access操作之後兩個點在輔助樹中一定是一個位於根,一個位於根的左兒子(深度)。所以在輔助樹中把這個邊砍掉就行了。

『Find操作』

目的:尋找一個點在原樹中的根。
用於:判斷兩個點的連通性。
具體實現:首先Access這個點,然後在輔助樹中將這個點轉到根,由於輔助樹按照深度爲關鍵字排序,所以不斷地向左子樹尋找,就可以找到深度最小的根。

差不多就這些啦,還有一些奇怪的求和啊,維護最大值最小值什麼的和線段樹平衡樹等數據結構基本一樣。也難怪,LCT其實就是線段樹、平衡樹的延伸。
---------------------
作者:wwyx2001
來源:CSDN
原文:https://blog.csdn.net/Blue_CuSO4/article/details/78618811
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章