線段樹(區間修改 區間求和)lazy標記版

2021-10-04 01:19:05 字數 2722 閱讀 2262

無lazy標記版

線段樹lazy標記模板題

void

push_down

(int p,

int lf,

int rt)

}

如果當前區間被標記但還要繼續遞迴下去,只需在下一次遞迴開始之前push-down,向下標記子節點即可。

區間修改**:

void

update

(int p,

int lf,

int rt,

int l,

int r,

int val)

push_down

(p,lf,rt)

;//判斷當前查詢區間有無lazy標記

int mid=

(lf+rt)

>>1;

if(l<=mid)

update

(lson,l,r,val)

;//若當前區間的左區間存在被覆蓋的情況則搜左區間

if(r>mid)

update

(rson,l,r,val)

;//若當前區間的右區間存在被覆蓋的情況則搜右區間

push_up

(p);

//合併更新後節點值

}

區間求和時因為不知道線段樹是否仍然存在被標記的點所以在每次遞迴之前仍需進行push-down操作以防萬一,其他的與無lazy標記時求和一樣。

區間求和**:

int

sum(

int p,

int lf,

int rt,

int l,

int r)

int he=0;

//判斷當前查詢區間有無lazy標記

push_down

(p,lf,rt)

;int mid=

(lf+rt)

>>1;

if(l<=mid) he+

=sum

(lson,l,r)

;//若當前區間的左區間存在被覆蓋的情況則搜左區間

if(r>mid) he+

=sum

(rson,l,r)

;//若當前區間的右區間存在被覆蓋的情況則搜右區間

return he;

}

完整**:

#include

using

namespace std;

#define int long long

#define lll 1000001

#define lson p<<1,lf,mid

#define rson p<<1|1,mid+1,rt

int ans[lll<<2]

,a[lll]

,lazy[lll<<2]

;int n,m;

void

push_up

(int p)

void

push_down

(int p,

int lf,

int rt)

}void

build

(int p,

int lf,

int rt)

int mid=

(lf+rt)

>>1;

build

(lson)

;build

(rson)

;push_up

(p);

}void

update

(int p,

int lf,

int rt,

int l,

int r,

int val)

push_down

(p,lf,rt)

;//判斷當前查詢區間有無lazy標記

int mid=

(lf+rt)

>>1;

if(l<=mid)

update

(lson,l,r,val)

;//若當前區間的左區間存在被覆蓋的情況則搜左區間

if(r>mid)

update

(rson,l,r,val)

;//若當前區間的右區間存在被覆蓋的情況則搜右區間

push_up

(p);

//合併更新後節點值

}int

sum(

int p,

int lf,

int rt,

int l,

int r)

int he=0;

//判斷當前查詢區間有無lazy標記

push_down

(p,lf,rt)

;int mid=

(lf+rt)

>>1;

if(l<=mid) he+

=sum

(lson,l,r)

;//若當前區間的左區間存在被覆蓋的情況則搜左區間

if(r>mid) he+

=sum

(rson,l,r)

;//若當前區間的右區間存在被覆蓋的情況則搜右區間

return he;

}void

chaxun

(int a)

if(a==2)

}signed

main()

}

POJ 3468 線段樹區間修改,區間求和

由於是區間求和,因此我們在更新某個節點的時候,需要往上更新節點資訊,也就有了tree root val tree l root val tree r root val 但是我們為了把懶標記打上,當節點表示的區間是完全被詢問區間包含,那麼這個區間的資訊都是有用的,因此我們其實只需要把這個節點更新,並打...

C 線段樹 區間修改 區間查詢

這次要引入乙個核心變數 lazy 懶標記 為了達到區間修改的目的 又為了減少運算量 所以就需要引入懶標記這個變數 用來滿足 即用即推 子線段要用了便向下推行 lazy 舉個例子 如果我們只用紅色這個線段 那就不用向下推 把 lazy 留在這裡 但是如果要用到橙色的部分 那就需要把 lazy 下推到橙...

線段樹 區間求和模板 (區間修改)

include include include include include include include include include define mem a memset a,0,sizeof a define mem2 a memset a,1,sizeof a define mod ...