線段樹是一種二叉樹,也就是說,每個線段都可以用一二叉樹表示
比如乙個長度為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的左右邊界已經確定,...