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

2021-10-08 20:45:56 字數 2546 閱讀 8180

模板題sdut oj 3771 陣列計算機

description

blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作:

操作 1:把陣列中第 p 個元素的值增加 v。

操作 2:計算陣列中 [l, r] 區間內所有數的和。

這個機器就是這麼的神奇,但是 blue 的計算機壞掉了,你能幫他修一下嗎?

input

輸入資料有多組(資料組數不超過 20),到 eof 結束。

對於每組資料:

第 1 行輸入乙個整數 n (1 <= n <= 10^5),表示陣列中元素的個數。

第 2 行輸入 n 個用空格隔開的整數 ai (1 <= ai <= 10^10),表示初始輸入到計算機中的陣列。

第 3 行輸入乙個整數 q (1 <= q <= 50000),表示使用者的操作次數。

接下來 q 行,每行輸入先輸入 1 個整數,表示操作型別,根據不同的操作型別:

如果型別為 1,則緊接著輸入 2 個用空格隔開的整數 p (1 <= p <= n) 和 v (1 <= v <= 10^10),表示要把陣列中第 p 個數的值增加 v。

如果型別為 2,則緊接著輸入 2 個用空格隔開的整數 l, r (1 <= l <= r <= n),表示要計算區間 [l, r] 內所有數的和(陣列下標從 1 開始)。

output

對於每組資料中的每次型別為 2 的操作,輸出 1 行,包含乙個整數,表示計算出的和。

sample

input

512

3455

2122

1514

10245

215

output

3

1519

25

accepted**:

#include

using

namespace std;

long

long arr[

100000];

long

long tree[

400000];

void

build_tree

(int node,

int start,

int end)

int mid =

(start + end)/2

;int left_node =

2* node +1;

int right_node =

2* node +2;

build_tree

(left_node, start, mid)

;//遞迴建樹 左分支和右分支

build_tree

(right_node, mid +

1, end)

; tree[node]

= tree[left_node]

+ tree[right_node]

;//遞迴完後兩邊分支的值加到乙個數的節點上

return

;//不知道有沒有用,但是一般給呼叫的函式加乙個return;讓其停止呼叫,防止呼叫的時候跳不出來

}void

update

(int node,

int start,

int end,

int index,

long

long value)

int mid =

(start + end)/2

;int left_node =

2* node +1;

int right_node =

2* node +2;

if(index >=

0&& index <= mid)

else

tree[node]

= tree[left_node]

+ tree[right_node]

;//由樹的下邊往上更新每乙個節點的值

return;}

long

long

search

(int node,

int start,

int end,

int l,

int r)

else

if(l <= start && end <= r)

//如果不用這個條件判斷,後邊會一直計算到每乙個葉子節點(做無用功)

else

if(start == end)

else

}int

main()

build_tree(0

,0, n -1)

;int t;

cin >> t;

while

(t--

)else}}

return0;

}

基礎線段樹(建樹,查詢,單點更新)

線段樹就是講一連串的數字轉換成樹的形式,有利於對資料進行操作,效率較高 下面是建樹操作 1 void build int l,int r,int i 左節點 l 右節點 r 當前節點 i28 int m l r 1,ls i 1,rs ls 1 m 為中點 ls 為左兒子 rs 為右節點 9buil...

線段樹建樹

線段樹是一種二叉樹,也就是說,每個線段都可以用一二叉樹表示 比如乙個長度為4的線段可以如此表示 4 1 2 3 4 1 2 3 4 如果你要表示線段上的和,最上面的根表示線段1 4的和 下面兩個子節點表示1 2,3 4的和,以此類推 卐 然後我們還可以得到乙個性質 節點i的權值 她的左兒子權值 她的...

線段樹 建樹 單點修改 單點 區間查詢

線段樹 sgement tree 是一種分治思想的二叉樹結構,用於在區間上進行資訊統計。與按照二進位制位進行區間劃分的樹狀陣列相比,線段樹是一種更加通用的結構 1.線段樹的每個節點都代表乙個區間。2.線段樹具有唯一的根節點,代表的區間是整個統計範圍,如 1,n 3.線段樹的每個葉節點都代表乙個長度為...