對[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為其...