C 區域和的查詢 線段樹法

2021-10-04 13:27:48 字數 2018 閱讀 7191

給定乙個整數陣列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...