1. 程式人生 > >[線段樹合併][學習筆記]

[線段樹合併][學習筆記]

前置知識

權值線段樹&動態開點線段樹

適用範圍

有時候我們需要對權值線段樹進行合併操作。然後就用到了線段樹合併。一般是有很多棵線段樹,然後需要將其中的兩棵合併起來。

方法

其實方法很簡單呢。就是分三種情況討論一下。假設現在要將線段樹a和線段樹b合併。並且a成為合併之後的線段樹。

如果a有當前子樹,而b沒有,那麼返回a的當前子樹

如果b有當前字數,而a沒有,那麼返回b的當前子樹

如果現在到了葉子節點,那麼就按照題目的要求將葉子節點合併起來。

不要忘記pushup

int merge(int cur,int a,int l,int r) {
    if(!cur) return a;
    if(!a) return cur;
    if(l == r) {
        //對葉子節點進行操作
        return cur;
    }
    int mid = (l + r) >> 1;
    Ls = merge(Ls,TR[a].ls,l,mid);
    Rs = merge(Rs,TR[a].rs,mid + 1,r);
    up(cur);
    return cur;
}

例題

做完這道例題應該就懂了。

luogu4556

題解