線段樹
在一類問題中,我們需要經常處理可以對映在乙個座標軸上的一些固定線段,例如說對映在ox軸上的線段。由於線段是可以互相覆蓋的,有時需要動態地取線段的並,例如取得並區間的總長度,或者並區間的個數等等。乙個線段是對應於乙個區間的,因此線段樹也可以叫做區間樹。
線段樹的構造思想
線段樹是一棵二叉樹,樹中的每乙個結點表示了乙個區間[a,b]。每乙個葉子節點表示了乙個單位區間。對於每乙個非葉結點所表示的結點[a,b],其左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2,b]。
線段樹的運用
線段樹的每個節點上往往都增加了一些其他的域。在這些域中儲存了某種動態維護的資訊,視不同情況而定。這些域使得線段樹具有極大的靈活性,可以適應不同的需求。
線段樹的實現(完全二叉樹)
資料結構
type
treenode = record
b, e: integer;
cover: integer;
end;
插入演算法
procedure insert(p, a, b: integer);
varm: integer;
begin
if tree[p].cover = 0 then
begin
m := (tree[p].b + tree[p].e) div 2;
if (a = tree[p].b) and (b = tree[p].e) then
tree[p].cover := 1
else if b <= m then insert(p * 2, a, b)
else if a >= m then insert(p * 2 + 1, a, b)
else begin
insert(p * 2, a, m);
insert(p * 2 + 1, m, b);
end;
end;
end;
統計演算法
function count(p: integer): integer;
begin
if tree[p].cover = 1 then
count := tree[p].e – tree[p].b
else if tree[p].e – tree[p].b = 1 then count := 0
else count := count(p * 2) + count(p * 2 + 1);
end;
線段樹模板(陣列實現)
首先是基本定義環節 因為線段樹左子節點和右子節點在建構函式的時候比較常用 我們就把這兩個語句簡化一下 define lson l,m,rt 1 define rson m 1,r,rt 1 1 const int maxn 5008 int num maxn 2 之後就是乙個更新函式 常用於線段樹某...
線段樹模板(模板)
參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img xhrgdjcd 1613976863463 區間儲存在陣列中的下標對應為 12 3 4 5 6 7 8 9 10 11 12 13 14 15 四部分單點更新 根據題目的要求編寫自己的pushup,query...
線段樹模板
include include include using namespace std const int size 10010 struct node the node of line tree class linetree void updatem void updateline public ...