線段樹可以進行區間更新,但是相比較於普通的線段樹單點更新和區間查詢的功能來說,區間更新與其最大的不同就是在與區間更新需要加一個懶惰標記,來記下對懶惰標記的理解。
懶惰標記用來干什么?
解釋:
理論上來說,如果[3, 9]這個區間被修改的話,那么下圖中的所有綠色的結點的值都要得到重新計算的:
但是實際上是沒有必要這么做的——我們可以引進一種叫做Lazy Tag,即延遲標記的東西——的確對於[3, 9]這樣一次修改操作,我可以只去修改如下圖中橙色的結點,但是在這個基礎上,我要在[3, 9]分解出的4個區間[3, 3], [4, 5], [6, 8], [9, 9]所對應的結點上做一個延遲標記,表示“之前有一次操作需要將這棵子樹中的所有結點的價格都進行修改,但是因為還沒有用到這棵子樹中的值所以我暫時不去修改”,
但是這些懶惰標記(即延遲標記,以下將不在區分二者)又有什么用呢?
其實就是一個暫時不處理,等到需要用到的時候再進行處理的思想。比如你之前說道的詢問了[6, 7]這個區間,那么我再從上往下分解的時候,你會發現[6, 8]這個區間上有一個懶惰標記,那么你就應該進行一個懶惰標記的‘下放操作’——也就是說去修改[6, 8]這個結點的左右兒子的值,並且同時給左右兒子添加上新的懶惰標記,然后將[6, 8]的懶惰標記去掉。
也就是說——本來[6, 8]的左右兒子早在之前的修改操作中就需要一同進行修改的,但是因為還沒有用到單獨的[6, 7],[8, 8]之類的區間的原因,所以我可以暫時不處理這些結點的修改,而是用一個懶惰標記記錄下來這些結點需要進行修改這件事情。然后在之后要用到這些值的時候再進行這些操作。