最近開始入門線段樹,先從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儲存了陣列中...