線段樹將資料儲存在所有葉節點,非葉節點用於儲存統計資訊,這些資訊可以協助取出區間的最小值、最大值、最小值索引值、最大值索引值、修改個別值、區間的最大累加和、區間所有值遞增減固定值等。使用空間換取執行效率,可以在O(log(n))完成更新資訊與修改資料。
以下以APCS202506第3題貪心闖關單點修改與取區間最小值,UVa11992 - Fast Matrix Operations區間修改為例。
APCS202506第3題貪心闖關單點修改與取區間最小值,需要找出區間最小值,並將該數值合併到最小值的下一個值,需要使用線段樹與DoubleLinkedList。
Step1)建立獲取答案的資料結構ans,取最小值與最小值索引值。
建立線段樹節點,用於線段樹的內部節點與葉節點,節點內的v的數值,葉節點的v儲存真正資料,內部節點的v儲存無意義的空值。節點的ans表示要獲得的區間資訊,例如:最小值與最小值的索引值等。
Step2)使用Node建立線段樹SegTree,使用Node陣列當成內部節點與葉節點,節點總數為所需資料節點(葉節點)的四倍。使用函式build建立線段樹;函式mergeAns合併左右兩邊節點,將資訊整合到上層節點。
函式SegTreeSet用於設定線段樹葉節點的數值,使用遞迴方式進行設定,遞迴結束後使用mergeAns更新上方所有節點的最小值與最小值的索引值。函式query遞迴查詢指定區間的資訊,並透過mergeAns查詢出指定區間的最小值與最小值的索引值。
Step3)使用DNode建立DoubleLinkedList,因為此題需要合併最小值與最小值的下一個值,才需要此結構,此與線段樹沒有關係。
Step4)第7到16行輸入節點數值並建立DoubleLinkedList,第17行建立線段樹。第18到35行需要找出區間[1,n]的最小值,並將該數值合併到最小值的下一個值。
UVa11992 - Fast Matrix Operations,將二維陣列轉換成一維陣列,使用區間方式更改segment tree。