延遲標記 線段樹

2021-09-26 09:14:57 字數 1163 閱讀 7977

以poj3468為例,我們使用線段樹+延遲標記技巧 來實現快速區間修改與區間查詢。

具體做法是,我們為每個節點增加乙個延遲標記add,如果add為0,則說明該點的所有子區間都已更新完成,否則說明其子區間仍需要+add。請注意,如果乙個節點被打上「延遲標記」,說明該節點曾經被修改過,但其子節點尚未被更新,即延遲標記說明的是子節點的待更新情況。

具體實現時,我們可以使用乙個函式spread來實現延遲標記向下傳遞。

#includeconst int maxn = 1e5+50;

typedef long long ll;

struct segmenttreet[maxn*4];

int a[maxn],n,m;

//將延遲標記向下更新一層

inline void spread(int p)

}//建樹 l和r是當前節點所代表的區間的左右端點

void build(int p,int l,int r)

int mid = (l+r)/2;

build(p*2,l,mid);

build(p*2+1,mid+1,r);

t[p].sum = t[p*2].sum + t[p*2+1].sum;

}//區間更新 如果當前區間被包含 則延遲標記

void change(int p,int l,int r,int d)

spread(p);

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

if(l <= mid) change(p*2,l,r,d);

if(r > mid) change(p*2+1,l,r,d);

sum(p) = sum(p*2) + sum(p*2+1);

}//區間查詢 當查詢到該區間時順便更新

ll ask(int p,int l,int r)

ll ans = 0;

spread(p);

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

if(l <= mid) ans += ask(p*2,l,r);

if(r > mid) ans += ask(p*2+1,l,r);

return ans;

}int main()else

} return 0;

}

延遲標記 線段樹

延遲標記 例題以poj3468為例,我們使用線段樹 延遲標記技巧 來實現快速區間修改與區間查詢。具體做法是,我們為每個節點增加乙個延遲標記add,如果add為0,則說明該點的所有子區間都已更新完成,否則說明其子區間仍需要 add。請注意,如果乙個節點被打上 延遲標記 說明該節點曾經被修改過,但其子節...

線段樹與延遲標記

線段樹 segmenttree 是一種基於分治思想的二叉樹結構,用於區間上進行資訊統計。與按照二進位制位進行劃分的樹狀陣列相比,線段樹是一種更加通用的結構。性質 線段樹每個節點都代表乙個區間。線段樹具有唯一的根節點,代表的區間是整個統計範圍。線段樹的每個葉節點都代表乙個長度為1的元區間.對於每個內部...

線段樹模板 (poj 3468)延遲標記

參考了胡浩大牛的 風格。include define lson l,m,rt 1 define rson m 1,r,rt 1 1 const int maxn 100010 long long add maxn 4 1 long long sum maxn 4 1 void pushup int ...