怎樣理解又乘又加的線段樹懶標記
阿新 • • 發佈:2018-02-25
div cnblogs 經驗 經歷 長度 mar body time gpo 也就是 \((val + add + \_add / mul) \times mul \times \_mul\),這就相當於原始是 \(val\) 的值加上了一組標記 \((add + \_add / mul , mul \times \_mul)\)。出現了小數,這樣不好。
,就相當於原始是 \(val\) 的值加上了一組標記 \((mul \times \_mul,add \times \_mul + \_add)\)。十分正常,這樣好。
大凡兩個標記,無非是先乘再加,與先加再乘的區別罷了。
先加再乘
我們以 \(val\) 來表示這個結點原始的值,\(add\) 和 \(mul\) 顧名思義是兩個標記。這樣,這個結點的值就被更新成了 \((val+add) \times mul\)。(其實 \(add\) 還要跟區間長度搞一搞,這裏就省略了)。我們就知道,這個結點經歷了加 \(add\) 和乘 \(mul\) 之後的值是 \((val+add) \times mul\)。
現在,從他的父親那裏傳來一組標記 \((\_add,\_mul)\)。本著先加後乘的原則,這個結點的值變成了 \(((val+add) \times mul + \_add) \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)\)
因此,我們就能輕松地寫出先乘再加的標記打法了。
怎樣理解又乘又加的線段樹懶標記