線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。
對於線段樹中的每乙個非葉子節點[a,b],它的左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2+1,b]。因此線段樹是平衡二叉樹,最後的子節點數目為n,即整個線段區間的長度.使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。
目前只看了線段樹的建立和查詢。
//從根節點開始,平分區間,遞迴的建立線段樹,線段樹的建立函式
const int maxnum = 1000;
struct segtreenode
segtree[maxnum];//定義線段樹
/*功能:構建線段樹
root:當前線段樹的根節點下標
arr: 用來構造線段樹的陣列
istart:陣列的起始位置
iend:陣列的結束位置
*/void build(int root, int arr, int istart, int iend)
}
//已經構建好了線段樹,那麼怎樣在它上面超找某個區間的最小值呢?查詢的思想是選出一些區間,使他們相連後恰好涵蓋整個查詢區間,因此線段樹適合解決「相鄰的區間的資訊可以被合併成兩個區間的並區間的資訊」的問題。
功能:線段樹的區間查詢
root:當前線段樹的根節點下標
[nstart, nend]: 當前節點所表示的區間
[qstart, qend]: 此次查詢的區間
*/int query(int root, int nstart, int nend, int qstart, int qend)
ACM訓練日誌
今天的比賽我們隊倆大佬出了倆題,後來過了時間又補了f題,總的來說我覺得今天訓練不簡單,被d題整的心態有點炸,後來于衡a掉了,貪心字首和,仔細看了隊友的 還是很有啟發的,附上原題和隊友的 原題 ac include using namespace std const int maxn 4e5 10 t...
ACM訓練日誌29 線段樹的區間更新
區間更新是指更新某個區間內的葉子節點的值,因為涉及到的葉子節點不止乙個,而葉子節點會影響其相應的非葉父節點,那麼回溯需要更新的非葉子節點也會有很多,如果一次性更新完,操作的時間複雜度肯定不是o lgn 例如當我們要更新區間 0,3 內的葉子節點時,需要更新出了葉子節點3,9外的所有其他節點。為此引入...
ACM訓練日誌6
數字dp的訓練賽結束了,但是自我感覺我的水平還是差遠了,光從解題數量也看的出來,而且做出來的題都是裡面比較水的題目,難一點的還是做不出來。其中有兩個數字dp 二分的題目,兩個題很相像,能做出來一道另一道乙個道理也就做出來了,但是我折騰了好久,都沒出,樣例不過。目前認識的數字dp主要是 求出在給定區間...