線段樹學習筆記

2022-01-19 19:12:58 字數 1765 閱讀 8371

之前就已經學過了,放在了本地,現在搬到來~

根據此,有build_tree:

void build_tree(int node,int start,int

end)

else

}

對於update,需要修改arr的某個數,改變最下面的start==end的結點,那麼上面跟它有關係的結點都要進行更新。start==end依然是作為遞迴的出口。看idx的位置,在左孩子裡就更新左孩子,否則右孩子。

void update_tree(int node,int start,int end,int idx,int

val)

else

}

然後是求區間和操作。基本一致。只是這裡要注意一下遞迴結束條件的優化:

}總的**:

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=1000

;void build_tree(int arr,int tree,int node,int start,int

end)

else

}void update_tree(int arr,int tree,int node,int start,int end,int idx,int

val)

else

else

tree[node]=tree[left_node]+tree[right_node];

}}int query_tree(int arr,int tree,int node ,int start,int end,int l,int

r)

else

if(l<=start&&end<=r)

else

if(start==end)

else

}int

main()

;

int size=6

;

int tree[maxn]=;

build_tree(arr,tree,

0,0,size-1

);

for(int i=0;i<15;i++)

cout

cout

<

update_tree(arr,tree,

0,0,size-1,4,6

);

for(int i=0;i<15;i++)

cout

cout

<

cout

<0,0,size-1,2,4

);}

線段樹學習筆記

線段樹是一種 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o logn 而未優化的 空間複雜度 為2n,因此有時需要離散化讓空間壓縮。以下筆記摘自lcomyn神犇部落格 1....

線段樹學習筆記

本文筆記在參考一步一步理解線段樹 tenos的基礎上形成 線段樹,也是二叉搜尋樹的一種,是基於陣列,但是優於陣列的一種資料結構。同時結合預處理 時間複雜度一般在o n 使得從原來陣列的o n 的查詢和更新複雜度降到了o logn 在處理很大資料量的資料更新和查詢最值方面變得簡單,值得一提的是,它的構...

線段樹學習筆記

線段樹是一種維護區間的資料結構,且滿足二叉樹的全部性質 下圖是一棵維護區間 1 6 1,6 的線段樹 格式 idl ri dl r我們可以發現,對於每個節點 k k 來說,其左節點編號為2k role presentation style position relative 2k2 k,右節點編號為...