區間樹 學習筆記

2022-04-02 14:03:32 字數 1694 閱讀 6933

目錄

但是這個東西,沒人知道不是沒有道理的,是真的,沒用

interval tree大概分為三種:centered interval tree、augmented tree、medial- or length-oriented tree。下面說的為centered interval tree。

給定\(n\)個區間(線段)。對於詢問給定的乙個區間或點,可以在\(o(\log n+m)\)時間內求出與詢問區間相交/包含詢問點的所有區間(\(m\)是答案區間的數量)。

構造:\(o(n\log n)\);空間複雜度:\(o(4n)\)。

區間樹(centered interval tree)是乙個二叉樹(上面csdn那篇寫錯了)。

依據所有線段確定乙個中間點\(x_\)。設每個區間的端點為\(l,r\)。對於\(r的區間分到左子樹中構造;\(l>x_\)的區間分到右子樹中繼續構造;剩下的就是包含\(x_\)的區間,分別按\(l\)從小到大、\(r\)從大到小排序後的兩種序列存在當前節點中。

也就是每個節點包含五個資訊(原文比較清楚)

\(x_\)的選取要保證劃分到左右子樹中的區間數各不超過\(n/2\),所以可以取所有端點的中位數作\(x_\)(可以用nth_element做到\(o(n)\))。

想乙個\(\log\)建樹好像是有點麻煩...

從根節點開始,若\(p,則查詢當前節點及左子樹;若\(p>x_\),查詢當前節點及右子樹;否則\(p=x_\),當前節點所有區間就是答案。

查詢乙個節點時,若\(p則該節點所有區間的\(r>p\),所以只需列舉\(s_a\)(按左端點排好序)中的區間就可以找到包含\(p\)的所有區間。

所以複雜度\(o(\log n+m)\)。

設詢問區間為\([q_l,q_r]\)。它與原有區間\([l,r]\)相交有兩種可能:\(l\)、\(r\)至少有乙個點在\([q_l,q_r]\)中;\([l,r]\)完全包含\([q_l,q_r]\)。

第一種情況,可以建一棵線段樹(csdn那篇用的b+樹,沒有必要吧),將每個區間插入到\(l,r\)兩個位置去,每個節點存\(l\)或\(r\)在該節點區間內的所有區間。查詢時區間查\([q_l,q_r]\)即可(注意去重,可以合併時歸併方便去重,也可以打標記)。複雜度\(o(n\log n),o(\log n+m)\)。

第二種情況,建乙個interval tree。用\([q_l,q_r]\)中任意一點\(p\)求與\(p\)相交的所有區間,然後判斷這些區間是否包含\([q_l,q_r]\)。這些區間一定也是答案區間(有可能與情況一重複),所以複雜度仍是\(o(\log n+m)\)。

對於\(n\)維「區間」的查詢依舊可以用interval tree。

基本同查詢與給定區間相交的所有區間。首先建乙個\(n\)維range tree存所有「區間」,對於每次查詢先找出存在某個點 在給定\(n\)維詢問區間內 的所有區間,即第一種情況。

對於第二種情況,建\(n\)棵interval tree解決每一維,\(n\)維答案的交集就是最終答案。

那個\(n\)維range tree,我以為是什麼神奇的東西,原來就是。。\(n\)維線段樹(線段樹套線段樹套線段樹...)。。所以複雜度是\(o(\log^n+n\log n+nm)\)的。

那個\(n\)維range tree可能可以用k-d tree寫。

區間dp學習筆記

定義 區間動態規劃問題一般都是考慮,對於每段區間,他們的最優值都是由幾段更小區間的最優值得到,是分治思想的一種應用,將乙個區間問題不斷劃分為更小的區間直至乙個元素組成的區間,列舉他們的組合 求合併後的最優值。設f i,j 1 i j n 表示區間 i,j 內的數字相加的最小代價最小區間f i,i 0...

區間dp學習筆記

怎麼辦,膜你賽要掛慘了,下午我還在學區間 dp 不管怎麼樣,計畫不能打亂 4 不 4 為啥我一開始就先弄模板呢?因為這東西看模板就能看懂。for int i 2 i len i 列舉區間長度 for int l 1,r l len 1 r n l r 列舉左端點和右端點 以下你可以搞一下事情 for...

學習筆記 區間dp

f l r w i n g 表示區間 l,r 中能否壓縮成 w i n g code below include using namespace std const int maxn 200 10 int n,w,i,n,g,le maxn fir maxn sec maxn f maxn maxn...