LeetCode 分類刷題 —— Segment Tree

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 題。

線段樹題型從簡單到困難:

  1. 單點更新:
    HDU 1166 敵兵布陣 update:單點增減 query:區間求和
    HDU 1754 I Hate It update:單點替換 query:區間最值
    HDU 1394 Minimum Inversion Number update:單點增減 query:區間求和
    HDU 2795 Billboard query:區間求最大值的位子(直接把update的操作在query里做了)
  2. 區間更新:
    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
  3. 區間合并(這類題目會詢問區間中滿足條件的連續最長區間,所以PushUp的時候需要對左右兒子的區間進行合并):
    POJ 3667 Hotel update:區間替換 query:詢問滿足條件的最左端點
  4. 掃描線(這類題目需要將一些操作排序,然后從左到右用一根掃描線掃過去最典型的就是矩形面積并,周長并等題):
    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) ??
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。