線段樹初步理解

2021-08-26 03:34:54 字數 1105 閱讀 9612

原本這兩天在搞網路流的....但最近幾次網賽多次遇到了線段樹的題目...意識到線段樹還是重要的...所以今天就初步的了解了線段樹最簡單的應用...單點更新...今天學習線段樹主要是看notonlysuccess大牛的模板(**風格非常好...很適合初學線段樹的來參考...網上的一些ppt也不錯...一步一步動態描述線段樹的演算法過程...

線段樹是一棵二叉樹...其根節點是整個區間...其葉子節點是單位區間...每次修改和查詢的時間複雜度都是o(logn)...線段樹的主要操作是

build ( 建樹...其中這個地方我和隊友討論過是不是可以省去這一步..直接都先清0..然後按照插入的方式乙個個插入...但自己研究了build部分的**發現這一步盡量還是不要省...因為其建樹時的速度比插入要快一些..)...其中引數sp是指的當前這個節點在二叉樹中的編號...不難推出其左孩子為2*sp...右孩子為2*sp+1..開始我寫的build是int類...然後最後是 return sum[sp]=build(l,mid,sp*2) + build(mid+1,r,sp*2+1); 但會出錯...原因是輸入資料不一定是2的階乘..也就是這棵二叉樹不一定時滿的...所以這樣賦值會呼叫到不要的空間..返回就會錯誤...

void build(int l,int r,int sp) int mid=(l+r)/2; build(l,mid,sp*2); build(mid+1,r,sp*2+1); sum[sp]=sum[sp*2]+sum[sp*2+1]; }

..insert(插入或者說更新單位區間的資料)..

void insert(int k,int data,int l,int r,int sp) int mid=(l+r)/2; if ( k<=mid ) insert(k,data,l,mid,sp*2); else insert(k,data,mid+1,r,sp*2+1); sum[sp]=sum[sp*2]+sum[sp*2+1]; }

getsum( 得到一段區間的和或者是最大值之類的 )...

int getanwser(int l,int r,int l,int r,int sp)

當然這只是線段樹的最簡單應用...其實關於單點更新的題目...用樹狀陣列應該程式設計複雜度會更低..效率也差不多...但這裡先當做是線段樹的乙個入門吧...

線段樹初步 可持久化線段樹

人的知識就好比乙個圓圈,圓圈裡面是已知的,圓圈外面是未知的。你知道得越多,圓圈也就越大,你不知道的也就越多。芝諾 線段樹以其特點能被用來解決許多的問題,其拓展性極強。故學好 用好線段樹對增加你的 長度有顯著作用。這篇簡小的文章,就來講一講線段樹的一種變式 可持久化線段樹 又作主席樹 函式式線段樹等 ...

理解線段樹

線段樹 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o logn 對於線段樹中的每乙個非 葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b...

線段樹理解

當我覺得我學習演算法剛剛從萌新到入門的時候,一類給定乙個區間然後給定一系列操作的題徹底的打擊了我,那時我才醒悟,程式設計路上,我一直是萌新。線段樹是乙個具有樹特性的資料結構,它是一顆二叉搜尋樹。如下圖為區間 1,10 所建立的線段樹 將每乙個區間序列二分成小區間,線段樹就儲存小區間的資訊,也就是每個...