之前就已經學過了,放在了本地,現在搬到來~
根據此,有build_tree:
void build_tree(int node,int start,int對於update,需要修改arr的某個數,改變最下面的start==end的結點,那麼上面跟它有關係的結點都要進行更新。start==end依然是作為遞迴的出口。看idx的位置,在左孩子裡就更新左孩子,否則右孩子。end)
else
}
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,右節點編號為...