勢能線段樹/吉司機線段樹
BZOJ3211 花神游歷各國
BZOJ5312 冒險
BZOJ4355 Play with sequence
BZOJ4695 最假女選手
\(A_i = max(A_i, x)\) 這種操作的 tag 不需要實際記錄下來, son.mn1 = min(max(son.mn1, dad.mn1), dad.mx1)
就行了。
修改 mn1, mn2
的時候需要特判區間只有 1 個數和 2 個數的情況,因為這些情況涉及到 mx1, mx2
也可能改變。
想清楚 tag_cover
和 tag_add
應該如何疊加。
想清楚怎樣更新嚴格的 mn1, mn2
。
代碼長的時候心態別崩,不要皮,不要打錯變量名……這是老生常談了。
善於利用黑暗暴走 OJ 。
關於復雜度證明:關鍵節點,似乎一個關鍵節點改變用一個 log ,然后根據 tag 標記的原理至多 log 個 tag ,所以理論上是 \(O(n\cdot \log^2 n)\) ,實際上接近 \(O(n\cdot \log n)\) 。
upd: 一點優化
-
雖然還沒有到達要修改的區間 \([s,t]\) ,但是修改操作對於包含 \([s,t]\) 的區間 \([l,r]\) 都已經沒有了影響,應該直接返回。
-
區間 and 上或者 or 上一個數 \(x\) ,查詢 \(max\) 的題,按位討論,對於 \(sum\_and\ xor\ sum\_or = 1\) 的位(等於 \(0\) 時顯然怎么操作都不會改變 \(max\) ),只要 \(x\) 在這些位的值全部相等即無影響,因為這樣要么完全沒有修改這些位,要么么全部修改成了一個相同的值。
((p->s_a ^ p->s_o) & x) == 0 || ((p->s_a ^ p->s_o) & x) == (p->s_a ^ p->s_o)
只討論了一種也不會太慢,但確實加上會快一些。
我為何會深入思考這個?因為 LOJ6507 「雅禮集訓 2018 Day7」A T 飛了。