權值線段樹&動態開點線段樹
有時候我們需要對權值線段樹進行合併操作。然後就用到了線段樹合併。一般是有很多棵線段樹,然後需要將其中的兩棵合併起來。
其實方法很簡單呢。就是分三種情況討論一下。假設現在要將線段樹a和線段樹b合併。並且a成為合併之後的線段樹。
如果a有當前子樹,而b沒有,那麼返回a的當前子樹
如果b有當前字數,而a沒有,那麼返回b的當前子樹
如果現在到了葉子節點,那麼就按照題目的要求將葉子節點合併起來。
不要忘記pushup
int merge(int cur,int a,int l,int r)
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
題解
線段樹合併學習筆記
線段樹合併對一整個樹做完時間空間複雜度是n log nn log n nlog n的,套點其他什麼東西複雜度就上去了 動態開點的話注意 空間 樹上主席樹啟發式合併的話不 空間是兩個log的,容易被卡,比如這題 我就被卡了 悲 當然線段樹合併貌似總是可以被spl ay splay spla y啟發式合...
線段樹合併學習筆記
就是兩顆線段樹合成乙個線段樹 那合成的線段樹是適合所有線段樹嗎 當然不是,是動態開點線段樹 這裡建n個節點的時候,每個節點建一棵樹 而且要按照一定的形態建立一條鏈 就是說如果最終形態是有n個數字的樹,那你初始化的那一條鍊子一定是這顆樹上扣下來的 這樣才方便合併 最重要的操作 流程 如果x和y有一顆樹...
學習筆記 線段樹合併
分析 線段樹合併人生第一題。網上的題解我都沒看懂 我自己講一下好了 線段樹合併就是把兩棵權值線段樹合併到一棵 那怎麼合併呢?假設有這麼兩棵樹 乙個結點代表一段值域區間有幾個數,那麼可以看出合併後應該是這樣的 然後具體步驟就是找到乙個結點,如果乙個結點一棵樹上有一棵樹上沒有,那麼直 接返回那個結點的編...