基於線段樹的RMQ結構

2021-10-06 17:20:19 字數 774 閱讀 2489

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)

//外部呼叫:query(a,b,0,0,n);

/* 此函式的意圖在於不斷尋找正確的區間,然後不斷比較最小值

當[l,r)被[a,b)包含直接返回dat[k]並不是說這就是答案

而是這是正確區間中的乙個最小值

如果說[l,r)只是[a,b)的乙個真子集,那麼程式一定會繼續尋找其他在區間[a,b)內的最小值

能取的區間的最小單位是1,所以只要[a,b)合理,就必能完整走完[a,b)

或者可以理解為,每個返回的有意義的(即返回的是dat),他們的區間最終組合起來,就是[a,b)

所以也就是我們將所有在[a,b)內的乙個或好幾個[l,r)的最小值去一一比較,那麼求出來的就是[a,b)的最小值

*/int

query

(int a,

int b,

int k,

int l,

int r)

基於線段樹的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

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

RMQ(線段樹實現)

t t第乙個線段樹程式,還沒a過題,不過也很感動,先貼出來 下標從0開始,輸入 1 1 結束.求每一段區間之間的最大值。include include typedef struct treenodenode int mymax int a,int b node buildtree int a,int...