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...