1. 程式人生 > >怎樣理解又乘又加的線段樹懶標記

怎樣理解又乘又加的線段樹懶標記

div cnblogs 經驗 經歷 長度 mar body time gpo

大凡兩個標記,無非是先乘再加,與先加再乘的區別罷了。

先加再乘

我們以 \(val\) 來表示這個結點原始的值,\(add\)\(mul\) 顧名思義是兩個標記。這樣,這個結點的值就被更新成了 \((val+add) \times mul\)。(其實 \(add\) 還要跟區間長度搞一搞,這裏就省略了)。我們就知道,這個結點經歷了加 \(add\) 和乘 \(mul\) 之後的值是 \((val+add) \times mul\)

現在,從他的父親那裏傳來一組標記 \((\_add,\_mul)\)。本著先加後乘的原則,這個結點的值變成了 \(((val+add) \times mul + \_add) \times \_mul\)

也就是 \((val + add + \_add / mul) \times mul \times \_mul\),這就相當於原始是 \(val\) 的值加上了一組標記 \((add + \_add / mul , mul \times \_mul)\)。出現了小數,這樣不好。

先乘再加

有了上面的分析經驗我們可以輕易的推算出 \(val\) 打上\((mul,add)\) 變成 \(val \times mul + add\)。再來一組標記 \((\_mul,\_add)\)就變成了 \((val \times mul + add) \times \_mul + \_add\) 也就是 \(val \times mul \times \_mul + (add \times \_mul + \_add)\)

,就相當於原始是 \(val\) 的值加上了一組標記 \((mul \times \_mul,add \times \_mul + \_add)\)。十分正常,這樣好。

因此,我們就能輕松地寫出先乘再加的標記打法了。

怎樣理解又乘又加的線段樹懶標記