線段樹的區間修改

2022-09-20 15:15:11 字數 1151 閱讀 4796

1 #include 2 #include3 # define lc (p<<1)  //

該節點的左孩子

4 # define rc (p<<1|1)//

右孩子5

using

namespace

std;67

//很類似與樹狀陣列

8int

n,m;

9struct

segment_tree

10tree[1000000]; //

線段樹陣列

14int a[1000000

];15

void build_tree(int p,int l,int r) //

p當前節點,l,r,表示範圍

1621

else

222829}

30void

free(int p,int l,int r,int

k)31

36void pushdown(int p,int l,int

r)37

44void update(int l,int r,int p,int l,int r,int

k)45

53else

5459

if(r>mid)

606364}

65 tree[p].sum=tree[lc].sum+tree[rc].sum;//

節點值的修改使得這個sum需要一直修改

66return;67

}68int query(int l,int r,int p,int l,int r) //

區間查詢

6975

7677

pushdown(p,l,r);

7879

int mid=(r+l)/2;80

if(l<=mid)

8184

if(r>mid)

8588

return

res;89}

90int

main()

9198 build_tree(1,1

,n);

99for(i=1;i<=m;i++)else

108}

109return0;

110 }

線段樹 區間修改

我們對於線段樹的區間修改你可以用乙個最傻的辦法迴圈進行單點修改 時間複雜度太高十分麻瓜 所以,我們要用乙個聰明的做法延遲標記 lazy 我們在執行修改指令時,同樣可以在 l pl pr r 的情況下立即返回,只不過在回溯之前向節點p增加乙個標記,標識 該節點曾經被修改過,但其子節點尚未被更新 如果在...

hdu Just a Hook(線段樹區間修改)

線段樹模板題,練的是懶惰標記。懶惰標記,就是更新一段區間的時候,如果小區間被包含在了所需要更新的區間裡面,那麼直接對代表這個區間的陣列元素賦值,之後做乙個標記 表示這個區間的子區間都需要更新 但是不繼續遞迴 這樣可以節省很多的時候 11657115 2014 09 15 14 17 26 accep...

線段樹 區間修改(Lazy Tag)

poj3468a problem with integers 傳送門 注意ans可能超出int 懶惰標記 之所以稱為懶惰標記,是因為我們在區間修改時,只修該結點的值,並在節點新增加乙個標記,讓子節點暫時處於不更新的狀態,等我們用到的時候再更新,這樣當我們在查詢的時候,如果我們到了乙個節點p,並且決定...