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,並且決定...