線段樹 建樹 單點修改 單點 區間查詢

2021-09-03 07:03:44 字數 1766 閱讀 3687

線段樹(sgement tree)是一種分治思想的二叉樹結構,用於在區間上進行資訊統計。與按照二進位制位進行區間劃分的樹狀陣列相比,線段樹是一種更加通用的結構:

1.線段樹的每個節點都代表乙個區間。

2.線段樹具有唯一的根節點,代表的區間是整個統計範圍,如[1,n]。

3.線段樹的每個葉節點都代表乙個長度為1的元區間,如[x,x]

4.對於每個內部

線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。

使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。而未優化的空間複雜度為2n,因此有時需要離散化讓空間壓縮。

在這片文章中,我先講一下最基本的建樹,單點修改,單點/區間查詢

線段樹是一種用空間換時間的演算法開建樹的陣列時切記一定要開4倍的陣列

#include

using

namespace std;

const

int maxn=

10000+10

;int a[maxn]

,sum[maxn*4]

;//四倍空間

inline

intread()

while

(ch>=

'0'&& ch<=

'9')

return s*w;

}inline

void

pushup

(int root)

//乘2是該節點的左節點,再加1則是右節點

inline

void

build

(int l,

int r,

int root)

int mid =

(l+r)

>>1;

build

(l,mid,root<<1)

;build

(mid+

1,r,root<<1|

1);pushup

(root);}

inline

void

update

(int l,

int r,

int root,

int num,

int w)

int mid =

(l+r)

>>1;

if(num <= mid)

update

(l,mid,root<<

1,num,w);if

(num > mid)

update

(mid+

1,r,root<<1|

1,num,w)

;pushup

(root);}

inline

intquery

(int l,

int r,

int root,

int num)

inline

intquery2

(int root,

int l,

int r,

int l,

int r)

intmain()

return0;

}

陣列實現線段樹建樹,單點修改,區間/單點查詢

如果單單只是區間查詢就沒必要pushdowm,用不著

結構體的就懶得打了

自己想去

線段樹單點修改區間查詢

這是一道模板題。給定數列 a 1 a 2 a n 你需要依次進行 qq 個操作,操作有兩類 1 i x 給定 i,x,將 a i 加上 x 2 l r 給定 l,r,求 ri la i 的值 換言之,求 a l a l 1 a r 的值 input 第一行包含 2 個正整數 n,q,表示數列長度和詢...

基礎線段樹(建樹,查詢,單點更新)

線段樹就是講一連串的數字轉換成樹的形式,有利於對資料進行操作,效率較高 下面是建樹操作 1 void build int l,int r,int i 左節點 l 右節點 r 當前節點 i28 int m l r 1,ls i 1,rs ls 1 m 為中點 ls 為左兒子 rs 為右節點 9buil...

線段樹模板(單點修改 區間查詢)

1547 例 1 區間和 時間限制 1000 ms 記憶體限制 524288 kb 提交數 2072 通過數 639 題目描述 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。輸入 輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數...