延遲標記
例題以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 ...