線段樹簡介

2022-03-18 14:02:42 字數 1789 閱讀 3804

1.構造 void build(int node, int begin, int end);

主要思想是遞迴構造,如果當前節點記錄的區間只有乙個值,則直接賦值,否則遞迴構造左右子樹,最後回溯的時候給當前節點賦值

#include using

namespace

std;

const

int maxind = 256

; int segtree[maxind * 4 + 10

];

intarray[maxind];

/*建構函式,得到線段樹

*/void build(int node, int begin, int

end)

}

intmain()

2.區間查詢int query(int node, int begin, int end, int left, int right);

(其中node為當前查詢節點,begin,end為當前節點儲存的區間,left,right為此次query所要查詢的區間)

主要思想是把所要查詢的區間[a,b]劃分為線段樹上的節點,然後將這些節點代表的區間合併起來得到所需資訊

int query(int node, int begin, int end, int left, int

right)

3.區間或節點的更新 及 線段樹的動態維護update

單節點更新

void updata(int node, int begin, int end, int ind, int add)/*

單節點更新

*/

int m = ( left + right ) >> 1

;

if(ind <=m)

updata(node * 2

,left, m, ind, add);

else

updata(node * 2 + 1, m + 1

, right, ind, add);

/*回溯更新父節點

*/segtree[node] = min(segtree[node * 2], segtree[node * 2 + 1

]);

}

區間更新(線段樹中最有用的)

void change(node *p, int a, int b) /*

當前考察結點為p,修改區間為(a,b]

*/

push_down(p);

/*把當前結點的標記向下傳遞

*/int mid = (p->left + p->right) / 2; /*

計算左右子結點的分隔點

if (a < mid) change(p->lch, a, b); /* 和左孩子有交集,考察左子結點

*/if (b > mid) change(p->rch, a, b); /*

和右孩子有交集,考察右子結點

*/update(p);

/*維護當前結點的資訊(因為其子結點的資訊可能有更改)

*/}

摘自:

線段樹 02 構建線段樹

public inte ce merger 不能再縮小的基本問題是 對treeindex指向的節點的情況進行討論 public class segmenttree 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treei...

線段樹 01 線段樹基礎

物理上 public class segmenttree public int getsize public e get int index 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引 private int leftchild int index 返回完全二叉樹的陣列表示中...

線段樹和zkw線段樹

好啦,我們就開始說說線段樹吧 線段樹是個支援區間操作和查詢的東東,平時的話還是蠻實用的 下面以最基本的區間加以及查詢區間和為例 線段樹顧名思義就是棵樹嘛,葉子節點是每個基本點,它們所對應的父親就是它們的和,具體如下圖 但是對於這樣的線段樹來說,操作所需的時間是遠達不到我們的要求的 會被t 因為我們會...