我們對於線段樹的區間修改你可以用乙個最傻的辦法迴圈進行單點修改(時間複雜度太高十分麻瓜)所以,我們要用乙個聰明的做法延遲標記(lazy)
我們在執行修改指令時,同樣可以在 l<= pl <= pr <= r 的情況下立即返回,只不過在回溯之前向節點p增加乙個標記,標識「該節點曾經被修改過,但其子節點尚未被更新」。
如果在後續的指令中,需要從節點p向下遞迴,我們再檢查p是否具有標記。若有標記,就根據標記資訊更新p的兩個子節點,同時為p的兩個子節點增加標記,然後清除p的標記。
也就是說,除了在修改指令中直接劃分成的o(logn)個節點之外,對任意給點的修改都延遲到「在後續操作中遞迴進入他的父親節點時」再執行。這樣一來,每條查詢或修改指令的時間複雜度都降低到了o(logn)。這些標記被稱為「延遲標記」。延遲標記提供了線段樹中從上往下傳遞資訊的方式。這種「延遲」也是設計演算法與解決問題的乙個重要思路。
附上**
#includeusing namespace std;const int maxn = 1e5+5;
struct segment_treetree[maxn*4];
long long a[maxn];
int n,m;
void pushup(int root)
void pushdown(int root)
}void build(int l,int r,int root)
int mid = (l+r)>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
pushup(root);
}void update(int l,int r,int al,int ar,int root,long long w)
pushdown(root);
int mid = (l+r)>>1;
update(l,mid,al,ar,root<<1,w);
update(mid+1,r,al,ar,root<<1|1,w);
pushup(root);
}long long query(int l,int r,int al,int ar,int root)
int main()
return 0;
}
hdu Just a Hook(線段樹區間修改)
線段樹模板題,練的是懶惰標記。懶惰標記,就是更新一段區間的時候,如果小區間被包含在了所需要更新的區間裡面,那麼直接對代表這個區間的陣列元素賦值,之後做乙個標記 表示這個區間的子區間都需要更新 但是不繼續遞迴 這樣可以節省很多的時候 11657115 2014 09 15 14 17 26 accep...
線段樹 區間修改(Lazy Tag)
poj3468a problem with integers 傳送門 注意ans可能超出int 懶惰標記 之所以稱為懶惰標記,是因為我們在區間修改時,只修該結點的值,並在節點新增加乙個標記,讓子節點暫時處於不更新的狀態,等我們用到的時候再更新,這樣當我們在查詢的時候,如果我們到了乙個節點p,並且決定...
線段樹區間修改模板
本來打算把大白書第三章一口氣攻下來的,但是這個線段樹也是卡了好久。不敢過題太快,怕自己走馬觀花到頭來結果什麼都不會。可也不能再拖了,在做題中也許有更多的體會。模板一 1 l r v 表示區間 l,r 所有元素都加上v 2 l r 表示查詢區間 l,r 的sum,min,max sumv o 的定義為...