線段樹是一種二叉樹可以用陣列來實現
儲存需要的空間為
n往上的2^n取整再乘以2
如 28 -> 32 x 2 -> 64足夠了
我們規定根節點為1
發現每個節點的左子節點為父節點的兩倍,右子節點為父節點的兩倍加一
//更新父節點
void
build
(int l,
int r,
int rt)
//rt---root表示當前的節點
int m =
(l + r)
>>1;
build
(l, m, rt <<1)
;build
(m +
1, r, rt <<1|
1);pushup
(rt);}
void
pushdown
(int rt,
int len)
}void
update
(int l,
int r,
int c,
int l,
int r,
int rt)
//[l,r]區間數加上c
pushdown
(rt, r-l+1)
;int m =
(l + r)
>>1;
if(l <= m)
update
(l, r, c, l, m, rt <<1)
;if(m < r)
update
(l, r, c, m +
1, r, rt <<1|
1);pushup
(rt);}
intquery
(int l,
int r,
int l,
int r,
int rt)
線段樹 區間求和模板 (區間修改)
include include include include include include include include include define mem a memset a,0,sizeof a define mem2 a memset a,1,sizeof a define mod ...
線段樹 求和
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 time limit 1 sec memory limit 128 mb submit 187 solved 130 submit status web board 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。注意 ...
線段樹 區間求和
給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1,a,b n k 0時表示將a處數字加上b,k 1時表示詢問區間 a,b 內所有數的和。對於每個詢問輸出對應的答...