線段樹總結 (補)

2021-06-07 22:57:00 字數 944 閱讀 4228

線段樹總結

昨天寫得太慢了,以致於忘了寫總結了。所以,特來補下。

首先,是離散化壓縮空間,雖然,可能存在不要離散化的情況,但那主要是用於線段不長的情況下,對於比較長的線段,就需要有到離散化,把線段的端點進行排序,確定端點數後再建樹。

這裡很抱歉,昨天的演算法只提到了離散化,但是實際上並沒有完成,所以對於未離散的資料來說,比較好理解,但是不知道如何離散。

來個例子,試試吧。

假設有5

條邊(我真懶,真的……),分別是

[1,10],[5,20],[12,25],[21,30],[32,50]

。端點排序(本例的端點沒有重複的)後,點的值和對應下標分別為:

1,5,10, 12, 20, 21, 25, 30, 32, 50

1,2,03, 04, 05, 06, 07, 08, 09, 10

再看看那個資料結構:

typedef struct segment segment;

left和

right

在離散化後,表示是該結點的左右端點的順序,就是下面一行的值,跟點個數有關。需要時,可以根據排序好的端點陣列轉成端點的值,當然也可以直接把端點的存進來,不過要多加兩個成員變數了。

線段輸入時,則是根據segtree[pos].a 

對應的端點的實際值來判斷線段匹配。

這裡就是什麼時候用位置,什麼時候用端點值的問題了。我就不解釋了,根據模板改改就可以了。

然後思想,主要是分治……這種不停取一半的總是跟分治有親戚關係。不停地分成原問題的一半大小,直到邊界條件,這是分的過程,治的過程可能是邊分邊治比如快排,也可能是分完再治,比如歸併。

而且貌似這種資料結構很容易就和動態規劃拉上關係了……具體看什麼問題了。

今天的目標是字尾陣列,這三個完成之後,過去的遺憾就補完了,開始把acm涉及的重要的演算法、資料結構過一遍吧,一邊做點題目。還是那句話,計算幾何除外,看心情可能會看看……

線段樹補 (挑戰的方法)

話說其實之前在計蒜客學線段樹就覺得費勁,弄了挺久好不容易算是理解了,這學長一說結果和我學的其實不大相同,就是少了乙個建樹的過程,或者說我的建樹不大正經 hhh 然後我也懶得再去試著寫這種,我就按之前那麼寫的的就ok了,然後當我在 挑戰程式設計 這本書看相關線段樹的章節時,說實話也就是看看,看了一眼覺...

線段樹總結

線段樹總結 線段樹的原理就是每乙個區間都可以被分成若干個不相交連續區間 重要 線段樹維護的資料 1.自身結構的資料 比如 左兒子 右兒子的編號 2.懶惰標記 整段區間都變成乙個值 或者將要進行什麼操作 根據每次操作的型別 把操作的區間分成若干個不連續的區間 然後把操作的標記賦值給相應的區間 3.答案...

線段樹總結

線段樹的入門級 總結 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹,最後的子節點數目為n,即整...