線段樹學習筆記

2022-08-22 21:39:11 字數 2425 閱讀 8655

線段樹學習總結

這個星期主要是進行線段樹的複習與進一步學習,做了些題目,將我的錯誤與注意事項總結在此。

在這次的學習中,我才算是基本會使用了線段樹,不再像以前,只能當做一種幫忙整段修改區間,求解區間最大值的資料結構,線段樹的優越就在於它的樹形結構,將任何操作都降到了log級別的,在此基礎上可以記錄很多資料,而並非只有節點的值。

我的線段樹習慣如下:

此種寫法參考了

1, 用root表示當前節點,不記錄節點區間,而是在遞迴過程中隨著函式的改變自動更新。

2, pushup()  是把當前結點的資訊更新到父結點

3, pushdown()是把當前結點的資訊更新給子節點

4, 要更改的區間用全域性變數x,y記錄下,不在遞迴的過程中傳遞

做了些題目,將其中2道說下 :

poj 3468

成段增減,區間求和問題

要注意的資料範圍,要使用longlong來儲存,另外需要注意的是用scanf()讀入long long的時候還是要用「%i64d」,因為會有負數的出現,在正整數的int範圍內使用什麼都無所謂。

下邊是部分的**

poj 3468過程

1

//更新結點資訊,即加減處理

2void updata(int l,int r,int

root)312

13int mid=(l+r)/2;14

//必須是臨時變數,避免遞迴時改變

1516

//left child

17 a[root*2][0]+=a[root][1]*(mid-l+1

); 18 a[root*2][1]+=a[root][1

];19

//right child

20 a[root*2+1][0]+=a[root][1]*(r-mid);

21 a[root*2+1][1]+=a[root][1

];22

//itself

23 a[root][1]=0;24

25 updata(l,mid,root*2

);26 updata(mid+1,r,root*2+1

);27

//change max

28 a[root][0]=a[root*2][0]+a[root*2+1][0

];29}30

31//

尋找區間累加和

32int find(int l,int r,int

root)

33

poj 3667

要求解的是尋找長度為len的最靠左邊的一段區間,將其佔據,或者將一段長度的區間釋放。

這次線段樹要記錄的就不是結點的值了,而是區間內的一些特殊的值,如下所示

1

struct

tree

2 a[maxn*4];

cover域的數字,0表示全為空的,1表示全被佔了,-1為其他情況,具體的思路見**注釋

poj 3667

#include #include 

#include

using

namespace

std;

const

int maxn=80100

;struct

tree

a[maxn*4

];int

n,m,color,len,x,y;

//初始化,每段空房間數為r-l+1

void build(int l,int r,int

root)

void pushdown(int l,int r,int

root)

}//updata father

void pushup(int l,int r,int

root)

void updata(int l,int r,int

root)

pushdown(l,r,root);

int mid = (l+r)/2

; updata(l,mid,root*2

); updata(mid+1,r,root*2+1

);

pushup(l,r,root);

}int query(int l,int r,int

root)

intmain()

else

}fclose(stdin); fclose(stdout);

return0;

}

學到最後,感想就是線段樹就是乙個log級別的資料結構,跟區間有關的很多值都可以記錄下來然後進行高效的操作,總的來說,就是分成兩個操作,修改和查詢,具體的區別根據實際的需要我們可以進行具體操作,我學到的可以進行【單點更新,成段更新,區間合併,掃瞄線】,遇到這類的資料結構,首先要考慮能不能使用線段樹求解了。

線段樹學習筆記

線段樹是一種 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為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,右節點編號為...