基於簡單線段樹的RMQ

2021-09-16 14:15:39 字數 808 閱讀 8421

線段樹是擅長處理區間的,是一種類似完美二叉樹的陣列結構。(完美二叉樹是所有葉子深度都相同,並且每個節點要麼是葉子節點要麼有兩個兒子的樹)。樹上的每個節點都維護乙個區間。根維護都是整個區間,每個節點維護的是父親的區間二等分後的其中乙個子區間,對區間對操作可以在o(logn)完成。

//初始化

void init(int n_)

}//求[a,b]的最小值

//k是節點編號,ab是所求區間,lr是對應的(l,r)區間

void query(int a,int b,int k,int l,int r)

//如果(a,b)包含(l,r),返回當前節點值

if(a>=l&&b<=r)

//如果有交集,並且(a,b)不包含(l,r),向下遞迴,返回兩個子節點的最小值

else

}線段樹有幾個規律:

1、完美二叉樹形式的線段樹的dat陣列長度為 2*n-1;(2n=n+n/2+n/4+....)

2、如果我們要更新第k個元素(k從0開始),則該元素在dat中的下標為k=n-1+k,即更新dat[n-1+k],既然該元素更新了,那麼上層也要更新,上層的下標為k=(k-1)/2,dat[k]=min(dat[k*2+1],dat[k*2+2]);(dat[k*2+1]該節點的左子樹,dat[k*2+2]該節點的右子樹)。

基於線段樹的RMQ

rmq range minimum maximum query 區間最值查詢,即給出長度為n的陣列a,以及m組詢問s t s t n 返回區間 s,t 中的最值。基於線段樹的方法實現的話,建樹o n 查詢o logn 相比st,適合用於n更大,m較小的情況。void built int k,int ...

基於線段樹的RMQ結構

dat為儲存線段樹的全域性陣列 const int max n 1 17 int n,dat 2 max n 1 初始化 void init int n 把第k個值更新為a void updata int k,int a 求 a,b 的最小值 k是節點的編號,l,r表示的是這個節點維護的區間 l,r...

簡單線段樹模板

入門第四天,前三天的沒時間補,回去再慢慢寫吧。今天學長講的是線段樹,講得很有老師的感覺.然後就是講的也都差不多聽懂了,只是有些細節在寫 的時候沒有注意到,一直錯。需要注意的點 1.在build的時候在left right時是node u a left 之前老是錯寫成node left a left ...