區間更新,線段樹

2021-10-02 01:33:39 字數 1644 閱讀 6402

對[l,r]進行區間更新

1)如果結點的區間被查詢區間[l,r]覆蓋,僅對該結點進行更新,並做懶標記,表示該結點被更新過,對該結點的子結點不再進行更新;

2)判斷在左子樹查詢,右子樹查詢。查詢過程中,若當前節點帶有懶標記,懶標記下傳給子結點(當前結點懶標記清除,子結點更新並做懶標記),繼續查詢;

3)更新最值

#include

#include

#include

using namespace std;

const

int maxn=

100005

;const

int inf=

0x3f3f3f3f

;int n,a[maxn]

;struct node//結點

tree[maxn*4]

;//樹結點儲存陣列

例如,在[1,10]的線段樹中修改[4,8]區間的值為20

再例如修改區間[3,7]的最值為2

//向下傳遞懶標記

void

build

(int k,

int l,

int r)

//建立線段樹,k表示儲存下標,區間[l,r]

int mid,lc,rc;

mid=

(l+r)/2

;//劃分點

lc=k*2;

//左孩子儲存下標

rc=k*2+

1;//右孩子儲存下標

build

(lc,l,mid)

;build

(rc,mid+

1,r)

; tree[k]

.mx=

max(tree[lc]

.mx,tree[rc]

.mx)

;//結點的最大值等於左右孩子最值的最大值

}void

update

(int k,

int l,

int r,

int v)

//將區間[l..r]修改更新為v

帶有懶標記的區間查詢和普通的區間查詢不同的是,在查詢過程中,如果遇到的結點有懶標記,則懶標記下移,繼續查詢,別的操作都一樣

//求區間[l..r]的最值

intmain()

線段樹之區間更新線段樹

在學習區間更新線段樹之間要先學習單點更新線段樹。情景引入 給乙個長度為n的陣列a,隨機修改區間陣列元素 a l a r 的值,然後求任意區間和。修改操作我們可以想到 for int i l i r i update 但是,這種方法很顯然比較費時,不夠優,所以有了今天要講的區間更新。懶惰標記 在講之前...

樹的區間查詢與更新(線段樹)

原題 include include include include include include include include using namespace std define clr x memset x,0,sizeof x define ll long long define typ...

點更新線段樹模板

對一列數,對每次詢問輸出對應區間的和,每次修改只修改乙個數的值。定義 struct tree 由於線段樹還是相對比較平衡的,所以可以使用陣列t來儲存這棵樹,對與某個節點i,t i 2 就是左子樹,t i 2 1 就是右子樹 建樹 線段樹的思想是每個節點記錄區間的資訊,某點區間1 n,則1 n 2為其...