給定乙個整數陣列nums,求這個整數陣列中,下標i到下標j之間的數字和(i<=j),a[i]+a[i+1]+…+a[j]。在求和的過程中,可能需要更新陣列的某個元素a[i]。
#include
//線段樹的構造
void
build_segment_tree
(std::vector<
int>
& nums, std::vector<
int>
& value,
int pos,
int left,
int right)
int mid =
(left + right)/2
;build_segment_tree
(nums, value,
2* pos +
1, left, mid)
;build_segment_tree
(nums, value,
2* pos +
2, mid +
1, right)
; value[pos]
= value[
2* pos +1]
+ value[
2* pos +2]
;}//線段樹的求和
intsum_range_segment_tree
(std::vector<
int>
& value,
int pos,
int left,
int right,
int qleft,
int qright)
if(qleft <= left && qright >= right)
int mid =
(left + right)/2
;return
sum_range_segment_tree
(value,
2* pos +
1, left, mid, qleft, qright)
+sum_range_segment_tree
(value,
2* pos +
2, mid +
1, right, qleft, qright);}
//線段樹的更新
void
update_segment_tree
(std::vector<
int>
& value,
int pos,
int left,
int right,
int index,
int new_value)
int mid =
(left + right)/2
;if(index <= mid)
else
value[pos]
= value[
2* pos +1]
+ value[
2* pos +2]
;}class
numarray
int n = nums.
size()
*4;for
(int i =
0; i < n; i++
)build_segment_tree
(nums, _value ,0,
0, nums.
size()
-1);
_right_end = nums.
size()
-1;}
void
update
(int i,
int val)
intsumrange
(int i,
int j)
private
: std::vector<
int> _value;
int _right_end;};
intmain()
執行結果為:
9
8
線段樹區間修改和查詢和單點查詢(線段樹模板1)
如題,已知乙個數列,你需要進行下面兩種操作 將某區間每乙個數加上 kk。求出某區間每乙個數的和。第一行包含兩個整數 n,mn,m,分別表示該數列數字的個數和操作的總個數。第二行包含 nn 個用空格分隔的整數,其中第 ii 個數字表示數列第 ii 項的初始值。接下來 mm 行每行包含 33 或 44 ...
線段樹的查詢 LintCode
對於乙個有n個數的整數陣列,在對應的線段樹中,根節點所代表的區間為0 n 1,每個節點有乙個額外的屬性max,值為該節點所代表的陣列區間start到end內的最大值。為segmenttree設計乙個 query 的方法,接受3個引數root,start和end,線段樹root所代表的陣列中子區間 s...
線段樹的構建和查詢
本系列函式引數表示為 k 節點儲存區間 l,r 的和,查詢 修改的點為 x 查詢 修改的區間為 x,y 我們從線段樹的定義可以知道,k 節點儲存 ls k 和 rs k 兩節點的和。所以,我們採用遞迴構建線段樹。當區間的左端點與右端點重合時,即為葉子結點。非葉子結點在回溯中計算出。void buil...