Segment Tree 的 Tips:
- 線段數的經典數組實現寫法。將合并兩個節點 pushUp 邏輯抽象出來了,可以實現任意操作(常見的操作有:加法,取 max,min 等等)。第 218 題,第 303 題,第 307 題,第 699 題。
- 計數線段樹的經典寫法。第 315 題,第 327 題,第 493 題。
- 線段樹的樹的實現寫法。第 715 題,第 732 題。
- 區間懶惰更新。第 218 題,第 699 題。
- 離散化。離散化需要注意一個特殊情況:假如三個區間為 [1,10] [1,4] [6,10],離散化后 x[1]=1,x[2]=4,x[3]=6,x[4]=10。第一個區間為 [1,4],第二個區間為 [1,2],第三個區間為 [3,4],這樣一來,區間一 = 區間二 + 區間三,這和離散前的模型不符,離散前,很明顯,區間一 > 區間二 + 區間三。正確的做法是:在相差大于 1 的數間加一個數,例如在上面 1 4 6 10 中間加 5,即可 x[1]=1,x[2]=4,x[3]=5,x[4]=6,x[5]=10。這樣處理之后,區間一是 1-5 ,區間二是 1-2 ,區間三是 4-5 。
- 靈活構建線段樹。線段樹節點可以存儲多條信息,合并兩個節點的 pushUp 操作也可以是多樣的。第 850 題,第 1157 題。
線段樹題型從簡單到困難:
- 單點更新:
HDU 1166 敵兵布陣 update:單點增減 query:區間求和
HDU 1754 I Hate It update:單點替換 query:區間最值
HDU 1394 Minimum Inversion Number update:單點增減 query:區間求和
HDU 2795 Billboard query:區間求最大值的位子(直接把update的操作在query里做了) - 區間更新:
HDU 1698 Just a Hook update:成段替換 (由于只query一次總區間,所以可以直接輸出 1 結點的信息)
POJ 3468 A Simple Problem with Integers update:成段增減 query:區間求和
POJ 2528 Mayor’s posters 離散化 + update:成段替換 query:簡單hash
POJ 3225 Help with Intervals update:成段替換,區間異或 query:簡單hash - 區間合并(這類題目會詢問區間中滿足條件的連續最長區間,所以PushUp的時候需要對左右兒子的區間進行合并):
POJ 3667 Hotel update:區間替換 query:詢問滿足條件的最左端點 - 掃描線(這類題目需要將一些操作排序,然后從左到右用一根掃描線掃過去最典型的就是矩形面積并,周長并等題):
HDU 1542 Atlantis update:區間增減 query:直接取根節點的值
HDU 1828 Picture update:區間增減 query:直接取根節點的值
Title | Solution | Difficulty | Time | Space | 收藏 |
---|---|---|---|---|---|
218. The Skyline Problem | Go | Hard | O(n log n) | O(n) | ?? |
307. Range Sum Query - Mutable | Go | Hard | O(1) | O(n) | |
315. Count of Smaller Numbers After Self | Go | Hard | O(n log n) | O(n) | |
327. Count of Range Sum | Go | Hard | O(n log n) | O(n) | ?? |
493. Reverse Pairs | Go | Hard | O(n log n) | O(n) | |
699. Falling Squares | Go | Hard | O(n log n) | O(n) | ?? |
715. Range Module | Go | Hard | O(log n) | O(n) | ?? |
732. My Calendar III | Go | Hard | O(log n) | O(n) | ?? |
850. Rectangle Area II | Go | Hard | O(n log n) | O(n) | ?? |
1157. Online Majority Element In Subarray | Go | Hard | O(log n) | O(n) | ?? |