LCT(Link Cut Tree)動態樹學習筆記

2021-08-13 20:00:25 字數 968 閱讀 9519

動態樹lct就是支援link,cut操作的樹形資料結構

整體思想和樹鏈剖分有些類似,每個點有一條實邊(重邊)與其兒子相連,剩下的都是虛邊(輕邊),然後用許多個splay來維護每條重鏈,記錄splay中每個點的父親節點,那麼這個splay的根節點指向的是另一條鏈(對應的是虛邊)

下面是lct的幾種基本操作

判斷這個節點是不是所處的splay的根,**很顯然

//c[x][0]表示x節點的左兒子,c[x][1]表示x節點的右兒子

bool isroot(int x)
重點來了,lct的關鍵操作

取出當前根節點到x節點的一段路徑然後放入splay中

過程實現起來很簡單

void access(int x)
換根操作,將x旋轉到它所在的樹根,每次換根的時候會將它到根路徑上的點關係翻轉,對其餘點都無影響

所以只需要將其路徑上的點access,然後放入splay中,打上翻轉rev標記即可

void makeroot(int x)
lct基礎操作

將x,y兩點間新建一條邊,同樣**很顯然

將x換到所在樹的根位置上,之後將這一整棵樹連向y

void link(int x,int y)
lct基礎操作

link對應的就是cut操作

先將x換到根的位置,然後取出x到y的路徑,放入splay中

把splay(y)旋轉,那麼此時y的左兒子必定是x,直接斷開就可以了

void cut(int x,int y)
詢問操作查詢x到y路徑上的資訊

和cut操作類似,先將x換到根的位置,然後access取x->y路徑上的點用splay維護即可

void query(int x,int y)

動態樹之LCT link cut tree 講解

by 動態樹是一類要求維護森林的連通性的題的總稱,這類問題要求維護某個點到根的某些資料,支援樹的切分,合併,以及對子樹的某些操作。其中解決這一問題的某些簡化版 不包括對子樹的操作 的基礎資料結構就是lct link cut tree lct的大體思想類似於樹鏈剖分中的輕重鏈剖分,輕重鏈剖分是處理出重...

WPF與緩動 四 弧形緩動

wpf與緩動 四 弧形緩動 周銀輝 弧形緩動就是其緩動曲線為一段圓弧,如何我們假設圓弧上的點的斜率為速度的話,那麼可以想像其速度的變化多麼具有戲劇性,其加速或減速來得很突然,與5次緩動差不多.參考以下 圓形緩動 protected override double getcurrentvaluecor...

Employment Planning 動規小練

employment planning 原題鏈結 對於當前月份所需人數,和僱傭最大所需人數之間的情況進行討論。由於解雇金額和僱傭金額的存在,會存在一次性僱傭更多的人以減少解雇金額的情況,所以要討論到所需最大人數。include include include include include incl...