基於線段樹的RMQ

2022-05-02 20:36:08 字數 365 閱讀 3712

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 l, intr)}

void update(int k, inta)}

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

查詢區間[a,b], 當前查詢結點的位置為k, 所表示的區間為[l,r],預設k為根結點

}

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

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