脫離acm隊伍已經一年多了,現在還能手寫的演算法不多,線段樹是其中一種。謹以此文紀念逝去的acm生涯
線段樹是一種二叉搜尋樹,常用於區間求和、區間求極值,其查詢和更新時間複雜度是o(logn)。
線段樹的主要操作包括初始化、更新和查詢
1.初始化
初始化過程是乙個遞迴演算法,從根節點遞迴全樹。作用是設定子節點區間範圍、區間和、子節點索引以及父節點的左右子節點索引
2.查詢
查詢過程是乙個遞迴演算法,從根節點遞迴全樹。首先初始化全域性變數res值為0,用以儲存結果,然後尋找最淺的被查詢區間包含的節點。若節點左右邊界均不在查詢區間內,直接return;若節點左右邊界均在查詢區間內,該節點區間值與res相加,return;否則繼續遞迴節點。
3.更新
更新過程與查詢比較類似,這裡不再贅述,其區別是更新會遞迴到最深的子節點,而不是查詢那樣淺嘗輒止
話不多說,還是上**吧
class linetree
else if(left <= node.left && right >= node.right)
else
}public query(left: number, right: number): number
private callupdate(node, index, value)
else
else }}
public update(index: number, value: number): void
}
線段樹普及版
ps 此處以詢問區間和為例 線段樹之所以稱為 樹 是因為其具有樹的結構特性。線段樹由於本身是專門用來處理區間問題的 包括 rmq rsq 問題等 所以其結構可以近似的看做一棵二叉查詢樹 emmmmm 圖是從網上偷的 對於每乙個子節點而言,都表示整個序列中的一段子區間 對於每個葉子節點而言,都表示序列...
指標版的線段樹
includeusing namespace std const int n 1000005 struct node tree n int x,t,outit n long long ans vectoraqueue n struct point data n void buildtree node...
非遞迴版線段樹模板
摘自這裡 0 定義 define maxn 100007 int a maxn n,n 原陣列,n為原陣列元素個數 n為擴充元素個數 int sum maxn 2 區間和 int add maxn 2 懶標記 1 建樹 void build int n 2 點修改 a l c void update...