線段樹建樹

2021-10-03 12:08:18 字數 934 閱讀 5955

線段樹是一種二叉樹,也就是說,每個線段都可以用一二叉樹表示

比如乙個長度為4的線段可以如此表示:

-------------------------------------------4

1-------------2-------------3------------4

1 2 3 4

如果你要表示線段上的和,最上面的根表示線段1~4的和

下面兩個子節點表示1 ~ 2,3 ~ 4的和,以此類推……

☽☀☽☀卐

然後我們還可以得到乙個性質:節點i的權值=她的左兒子權值+她的右兒子權值。

根據這個思路,我們就可以建樹了:設乙個結構體tree[i];

tree[i].sum表示當前的線段和,tree[i].r和tree[i].l分別代表該節點的左右下表

我們知道乙個二叉樹中乙個節點i的左子樹等於i2,右子樹為i2+1

根據剛才的性質尅一的到**:tree[i].sum=tree[i2].sum+tree[i2+1].sum;**

就可以建立乙個線段樹了

**如下:

inline

void

build

(int i,

int l,

int r)

int mid=

(l+r)

>>1;

build

(i*2

,l,mid)

;//分別構造左子樹和右子樹

build

(i*2+1

,mid+

1,r)

; tree[i]

.sum=tree[i*2]

.sum+tree[i*2+

1].sum;

//剛才我們發現的性質return ;

}

初步認識線段樹(1)線段樹用途 建樹

當你遇到了這樣的題目時 現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。l 0 2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,...

線段樹的建樹 更新 查詢操作

模板題sdut oj 3771 陣列計算機 description blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作 操作 1 把陣列中第 p 個元素的值增加 v。操作 2 計算陣列中 l,r 區間內所有數的和。這個機器就是這麼的神...

線段樹(一)建樹 求區間和

線段樹是一種二叉樹,可以快速的查詢區間和,解決區間類問題 節點i,左邊界l,有邊界r,區間和的值tree i tree i 1 tree i 1 1 左兒子節點下標i 1,左邊界l,右邊界l r l 1 右兒子節點下標i 1 1,左邊界l r l 1 1,右邊界r 因為每個節點i的左右邊界已經確定,...