1. 程式人生 > >[動態開點線段樹][學習筆記]

[動態開點線段樹][學習筆記]

權值線段樹

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

動態開點

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

思想

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

void update(int &rt,int l,int r,int pos,int c) {
    if(!rt) {
        rt = ++num;
        tree[rt] = 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

題解