動態開點線段樹 學習筆記

2022-04-10 05:42:31 字數 596 閱讀 5142

所謂權值線段樹,就是指線段樹記憶體的是權值。好像是廢話。給出一些數,要查詢乙個區間內的數的個數。這時可以用權值線段樹,開個n(n為給出的數的最大值)個點的線段樹。然後就能輕鬆的維護了當然樹狀陣列更簡單

為什麼要動態開點呢?當然是因為空間不夠啊。比如還是上面那個例子。加入給出的數的最大值為\(10^\),並且無法離散化,顯然空間開不下。那麼就需要動態開點了。

動態開點的思想就是,初始線段樹只有乙個根。當插入節點的時候在把那些需要的節點開出來。具體方法其實看一下**就明白了。

void update(int &rt,int l,int r,int pos,int c) 

tree[rt] = min(tree[rt],c);

if(l == r) return;

int mid = (l + r) >> 1;

if(pos <= mid) update(ls[rt],l,mid,pos,c);

else update(rs[rt],mid + 1,r,pos,c);

}

這就是插入的**。注意在rt上面是有"&"的。其他的操作就和普通線段樹一樣了。

hdu6183

題解

學習筆記 動態開點線段樹

通過只開需要使用的結點以節省空間。實現過程就是把點乙個乙個往樹裡面插。建樹時遞迴進入當前結點的子結點後,若該結點為 0 即不存在,就開點。所謂開點即為把當前結點的編號設定為 tot 這樣處理下來,每個結點的編號顯然是亂序的。可以 l son 和 r son 分別記錄左右子結點的編號,然後讓它們代替普...

動態開點線段樹

前置芝士 眾所周知,普通線段樹空間複雜度是 o n 4 所以當n很大的時候,如果正常的去建一顆線段樹,開4倍n空間顯然會炸記憶體 怎麼辦呢?這個時候,動態開點線段樹出現了。概念 動態開點線段樹是一類特殊的線段樹,與普通的線段樹不同的是,每乙個節點的左右兒子不是該點編號的兩倍和兩倍加一,而是現加出來的...

旅行 樹剖,動態開點線段樹

對每一種教派開一顆線段樹,但是很明顯空間會爆,所以動態開點線段樹,所以空間複雜度降低到nlo gnnlogn nlog n,然後樹剖套線段樹,碼量稍大 include define m 200009 using namespace std intread for isdigit ch ch getc...