動態樹雜談

2021-08-26 08:31:36 字數 1169 閱讀 4916

動態樹,一類用來維護森林連通性的資料結構,主要使用splay來維護偏愛點/邊(preferred child/edge),並且通過點在不同splay中的移動提取路徑,或者是修改父子關係以連線或斷開樹邊

動態樹由於其需要動態的修改點/邊關係,所以需要動態的維護點/邊,從而選擇偏愛點/邊而不是像樹鏈剖分中使用輕重點/邊,同時需要spaly維護

每個splay中儲存著一條偏愛路徑,從淺到深維護深度

因為在同一棵樹中,路徑是有交點的,不同的splay通過這些交點聯絡起來

不想多說,看**注釋

**如下:

#include 

using

namespace

std;

const

int n = 300010;

#define l ch[x][0]

#define r ch[x][1]

struct lct

void update(int x)

void pushdown(int x) }

bool isroot(int x)

void rotate(int x)

void splay(int x)

while(top) pushdown(sta[top --]);

//從上向下傳遞所有標記,防止剩餘

for(int fa ; !isroot(x) ; rotate(x))

}void access(int x)

}void makeroot(int x)

int find(int x)

void split(int x , int y)

void cut(int x , int y)

}void link(int x , int y)

}lct;

int read()

while(ch >= '0' &&ch <= '9')

return ans * flag;

}int main()

case

1 :

case

2 :

case

3 : }}

return

0;}

C語言雜談 動態分配記憶體

所謂動態記憶體分配 dynamic memory allocation 就是指在程式執行的過程中動態地分配或者 儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。動態記憶體分配較靜態記憶體...

演算法雜談 02 樹鏈剖分

我們知道,對一段連續區間進行修改 求和 求極值 操作,可用線段樹等資料結構進行維護。那麼,如果這不是乙個區間,而是一棵樹,我們又能怎樣解決?此時我們就用到了樹鏈剖分 這一專為此類的問題而生的演算法。樹鏈剖分的原理是將一棵樹劃分為幾部分並分別對映到一維區間中,這樣對樹進行操作就可以轉化為對一維區間進行...

演算法雜談 二叉樹

如下圖,如果需要新增節點 20,則位置在綠色的地方 15 因為20 15,所以作為右節點新增 在這裡插入描述 如果需要新增節點 60,因為找不到符合規則的位置,最後查詢的地方會是70,所以作為70的左節點 葉子節點 在這裡插入描述 這個看著有點繞,我們來看個例子,假設下圖需要刪除根節點 50 我們找...