線段樹的簡單操作(入門級別)

2021-09-25 19:06:31 字數 1857 閱讀 5599

一些線段數的基本操作

比如建樹,單點修改,單點查詢,

單點修改和區間查詢(區間和),

區間修改和區間查詢,甚至

單點詢問,區間修改。這些操作都是有著差異性。尤其是區間修改,需要用到llazy標記。

另外,建樹也分為很多種(取決於每個父結點的意義)

比如以最大或最小值建樹(有的題還讓你求乙個區間內最大與最小值之間的落差,這種情況只要開乙個結構體即可),還有區間和。

#include

#include

#include

#define n 400010

int inf=

99999999

;using namespace std;

long

long mi[n]

,a[n]

;long

long p=

1,q=1;

void

buildmin

(int k,

int l,

int r)

//最小值建樹

int mid=

(l+r)/2

;buildmin

(k<<

1,l,mid)

;buildmin

(k<<1|

1,mid+

1,r)

; mi[k]

=min

(mi[k<<1]

,mi[k<<1|

1]);

//自下而上,當前k取左右兒子較小,**該位置的條件因題而異**

}void

buildsum

(int k,

int l,

int r)

//求和建樹

int mid=

(l+r)/2

;buildsum

(k<<

1,l,mid)

;buildsum

(k<<1|

1,mid+

1,r)

; mi[k]

=mi[k<<1]

+mi[k<<1|

1];//變化僅此而已

}int

query_min

(int k,

int l,

int r,

int x,

int y)

//簡單的區間詢問操作

void

change

(int k,

int l,

int r,

int x,

int v)

//點修改操作

int mid=

(l+r)/2

;change

(k<<

1,l,mid,x,v)

;change

(k<<1|

1,mid+

1,r,x,v)

; mi[k]

=min

(mi[k<<1]

,mi[k<<1|

1]);

//感覺和建樹bulid類似

}int

main()

/*測試資料:

85 3 7 9 6 4 1 2

3 43 4 表示查詢區間[3,4]的最小值,應該為7

最小值建數注意:

1.最好build(1,1,n)

2.l=r時,mi[k]=a[l],這個時候的l正號對應相應序列的id

3.建樹mi[4*n]

4.(n<<1)-1 括號不能少 (n<<1-1..算術優先)

*/

線段樹的入門級

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

python實現的入門級別死爬蟲

學習使我快樂。這幾天學了python基本語法,網易雲 慕課網,總之就是挑著不要錢的上2333 炮姐曾經說過 def gethtml url 獲取網頁源 web urllib.request.urlopen url html web.read return html def getpng html r...

linux簡單使用正規表示式(入門級別)

定義 正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元 以及這些特定字元的組合,組成乙個 規則字串 這個規則字串用來表達對字串你的一種過濾邏輯 正規表示式的特定字元 匹配操作符 轉義字元 匹配任意單個字元 1234 匹配1 4中的任意單個字元 12 匹配任意乙個非1非2的單個字元...