線段樹的應用方法總結


通過總結許多線段樹的題目,發現它的使用方法並不是千變萬化的,實際上只有幾種固定的用法。

本文是本博客獨家總結,別處的地方是找不到的。

 

另外,如果你並沒有學過線段樹,請先通過下面的鏈接去學習一下線段書的基本知識

http://wenku.baidu.com/view/fe91a24433687e21af45a9e4.html

 

本文主要針對那些已經基本掌握了的線段樹數據結構,但是對解題還不是很熟悉的同學。

現在遇到的線段樹共有如下3種:

1.插入點型

對於這種線段樹,通常是向線段樹中插入點,即對應一個葉子節點的信息,而線段樹中所有節點也都是記錄的關於以該點為根的子樹中已插入的點的統計信息,詢問通常是問線段樹中某個區間對葉子節點的統計信息。

例題:POJ2887

2.線覆蓋型

對於這種線段樹,與第三種有一下共同特點:所有詢問和插入操作都是以區間為單位的,每次都是對一個區間進行操作。每個節點通常會用一個變量來記錄以它為跟的子樹的相關信息,在回溯過程中更新此變量。當操作的區間能完整的覆蓋一個節點對應的區間時直接對該節點操作,不再向下操作。

這種線段樹還有其獨有的特點:當操作一個短線段時,這個短線段在線段樹中由上至下運行到自己對應的位置,這個過程中會經過若干個對應長線段的節點,在經過長線段時,要把長線段的節點中的信息移動到其兩個直接子節點中,然后再繼續向下走。這樣可以保證區間信息存儲位置的在樹中的縱向專一性,即樹中節點的直系血親之間只能有一個點記錄信息。

原因如下:在這種線段樹的題通常具有以下性質:(1)新插入線段與舊的線段重疊的部分的信息如果縱向分布,不存儲在同一個節點中,則在回溯統計子樹信息過程很難計算。(2)新插入的線段與舊線段的重疊部分可以只保存新線段信息,這樣才能插入過程中完整覆蓋一個節點時不用向下操作。

例題:POJ2777

3.線保留型

這種線段樹除了與第二種線段樹的共同特點外,還有一個重要特性就是即使舊線段與新線段重疊了舊線段中的信息也仍然有意義,或者要求插入的線段必須保持在其插入的位置不向下迭代。

其中保持位置的一種典型情況就是有刪除操作。刪除並不是隨意的刪除,每次刪除的線段與原來插入的線段相對應,只刪除那些曾經插入過的線段。這種通常我們為了刪除時候方便,在短線段向下運行經過長線段的過程中不會把長線段向下迭代,因為長線段是要被刪除的,如果向下迭代刪除時就沒有辦法對長線段原來的存儲節點進行操作,只能對其許許多多的后代節點中的一些(那些被迭代到了的節點)進行操作,復雜度極高。這種線段樹的題通常信息縱向分布也是可以回溯計算的。

例題:POJ3468 POJ1177


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM