初識線段樹(線段樹總結)

2021-07-03 05:00:41 字數 1030 閱讀 3988

線段樹的最基本的操作:

[1]  建樹 :

void construct(int left, int right)

}上述**利用二分的方法,建立一棵葉子節點為 (i, i+ 1)的線段樹 。 特點是每棵樹的根,一定包含於子樹的線段。

[2] 插入一段線段:

void insert(int index, int c, int d)}}

解釋 :當要插入的線段[c, d] 覆蓋了線段樹上的某段線段的時候,將其標記覆蓋的cover陣列自加。如果不覆蓋該線段,分為三種情況,可自己畫          一下,再根據當前線段於要插入線段的關係,分情況遞迴左右子樹

if(c <= leftvalue[index] && rightvalue[index] <= d)

cover[index]++;

c < mid  && d< mid   

if(c < mid)insert(leftchild[index], c, d);

c > mid && d >mid  執行

if(d > mid)insert(rightchild[index], c, d);

c < mid && d > mid 執行

if(c < mid)insert(leftchild[index], c, d);

if(d > mid)insert(rightchild[index], c, d);

[3]刪除一段線段:

void delete(int index, int c, int d)}}

與插入一樣理解。

[4] 統計:

關於統計,有很多,也很靈活,對於每個題目來說,線段樹內每個節點內的要表示的有很多,很靈活,這裡只說說測度,也就是最後被覆蓋的線段的總長度

void count(int index)}}

理解 :既然某段線段的cover是正數,那麼,它的子樹也一定被cover,因為前面說過的「特點是每棵樹的根,一定包含於子樹的線段」

所以長度 = 右邊界 - 左邊界;

以上為線段樹的最基本的操作,是對長度的操作。

2018 08 18 線段樹(線段樹)

線段樹 描述請你維護乙個線段樹 支援一下操作 a x l r 區間 and x o x l r區間 or x x x l r 區間 xor x s l r 區間求和 輸入乙個數 t表示資料組數 乙個數n表示初始序列長 m表示查詢 隨後n個整數 接下來m次詢問 如上 輸出所以s次詢問的答案 樣例輸入 ...

線段樹 線段樹練習五

description 一行n個方格,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數可能達到100...

3306 樹 線段樹

3306 樹 首先dfs整顆樹將樹轉換線性結構,前兩個操作比較簡單,然後主要是對於操作三,有三種情況 1.x rt,那麼我們直接求出整顆樹中的最小值就是答案 2.x在原樹中為rt的祖先節點,那麼我們首先求出從x到rt路徑上的x的第乙個節點y,那麼答案就是除了以y為根的子樹的其他所有節點的最小值 3....