線段樹(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行,每行有三個正整數...