線段樹的構建和查詢

2022-08-21 20:24:14 字數 868 閱讀 6096

(本系列函式引數表示為\(k\)節點儲存區間\([l,r]\)的和,查詢/修改的點為\(x\),查詢/修改的區間為\([x,y]\))

我們從線段樹的定義可以知道,\(k\)節點儲存\(ls(k)\)和\(rs(k)\)兩節點的和。所以,我們採用遞迴構建線段樹。當區間的左端點與右端點重合時,即為葉子結點。非葉子結點在回溯中計算出。

void build(int k, int l, int r)

int mid = (l + r) >> 1;

build(ls(k), l, mid);

build(rs(k), mid + 1, r);

tree[k] = tree[ls(k)] + tree[rs(k)];

}

單點就很簡單啦,直接遞迴到葉子結點。對於非葉子結點,如果要查詢節點\(x<=mid\)就去左端點找,否則去右端點找。

int ask(int k, int l, int r, int x)

這裡就稍微複雜一點,我麼需要分兩種情況。

首先,記當前區間為\([l,r]\),需要查詢區間為\([x,y]\)

當前節點的區間被需要查詢的區間完全覆蓋\((x <= l && r <= y)\),那我們直接在答案上加上當前節點的值就好了。

2.當前節點所在區間沒有沒需要查詢的區間完全覆蓋,這時候,如果\(x <= mid\)我們就在左子節點尋找,如果\(y>mid\)就去右子節點尋找。

#define ll long long

ll query(ll k, ll l, ll r, ll x, ll y)

完結撒花!!!

線段樹的構建,查詢與更新

線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段 現的次數,時間複雜度為o logn 而未優化的空間複雜度為2n,實際應用時一般還要開4n的陣列以免越界,因此有時需要離散化讓空間壓縮。想要理解線...

線段樹 02 構建線段樹

public inte ce merger 不能再縮小的基本問題是 對treeindex指向的節點的情況進行討論 public class segmenttree 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treei...

伸展樹的構建和最基本的插入與查詢

描述 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現 一定的波動,當然一定的波動是能...