線段樹的實現(模板)

2021-05-01 07:02:24 字數 1305 閱讀 3498

線段樹

在一類問題中,我們需要經常處理可以對映在乙個座標軸上的一些固定線段,例如說對映在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 ...