模板題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.線段樹的每個葉節點都代表乙個長度為...