線段樹入門

2021-08-18 01:21:23 字數 1104 閱讀 2512

最近開始入門線段樹,先從hdu1166開始把。

線段樹適合多次查詢,更新節點等操作,並不適合刪除操作,查詢時間複雜度為o(logn);

這道線段樹的入門題在網上看了很久的**,發現難點並不在建樹上面,建樹的操作就是把要操作的值分為許多的單位區間,並且儲存到樹的葉節點中,向上可以表示不同區間內要查詢的結果,這裡需要用到遞迴建樹。

然後是關於線段樹的查詢和更新,這裡還有些糊塗,先慢慢想著理解下吧。

下面是這道題的**:移位運算子寫的太多,看上去很疲憊,最好還是用其他方法表示。(951ms)

#include #include #include using namespace std;

int num[50050];

struct node

b[50050*3];

void build(int left,int right,int i) //i代表起始節點也就是當前節點

build(left , (left+right)>>1 ,i<<1);

build(((left+right)>>1)+1,right,i<<1|1);

b[i].sum = b[i<<1].sum+b[i<<1|1].sum;

}void add(int id,int tmp,int i)

else

}int query(int left ,int right,int i)

if(right <= ((b[i].left+b[i].right)>>1)) return query(left,right,i<<1);

else if(left > ((b[i].left+b[i].right)>>1)) return query(left,right,i<<1|1);

else return query(left,(b[i].left+b[i].right)>>1,i<<1)+query(((b[i].left+b[i].right)>>1)+1,right,i<<1|1);

}int main()

build(1,n,1);

cout<<"case "<>cmd&&cmd[0]!='e'){

cin>>x>>y;

if(cmd[0] == 'q')

cout<

線段樹入門

線段樹 interval tree 是把區間逐次二分得到的一樹狀結構,它反映了包括歸併排序在內的很多分治演算法的問題求解方式。上圖是一棵典型的線段樹,它對區間 1,10 進行分割,直到單個點。這棵樹的特點 是 1.每一層都是區間 a,b 的乙個劃分,記 l b a 2.一共有log2l層 3.給定乙...

線段樹入門

學習下 線段樹的入門級 總結 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹,最後的子節點數目為...

線段樹 入門

首先線段樹形象來說就是將陣列看成乙個線段,然後不斷的進行分割,儲存在樹中的不同節點上,有點類似於b 樹的定義吧 觀察上圖,首先將整個陣列的某種資訊 最大值或者最小值等 儲存在根節點,對應 1,8 然後對 1,8 線段進行平分,得到 1,4 和 5,8 兩個線段,掛在樹的第二層。這樣節點2儲存了陣列中...