這幾天做了一些線段樹,發現線段樹問題還是主要分為兩大類的。
第一類是普通的區間資訊維護,查詢
大多數問題屬於這類,我們平時學習線段樹的例題也都以這類為主。
當然,具體還包含像成段更新,打標記等等很多種,但是這類線段樹都是遇到完整區間就返回值,利用左右兩個子區間的資訊維護父親區間的資訊。
這種題目很多,也很常見。
而另外一類我個人接觸的比較少。這種線段樹問題不用左右兩個兒子維護父親,也不用整段區間返回。相反,這類問題是利用線段樹維護的資訊進行二分查詢。對於乙個大區間,選擇左兒子或者右兒子只在這乙個兒子內查詢。(大概就是所謂的線段樹自頂向下的型別)
舉一些例題:
poj 2828 這個題需要查詢一段區間內的第i個空是誰。我們維護乙個區間內有多少個空,如果乙個大區間的左兒子的空數<=i ,就在左兒子種查詢,反之就在右兒子種查詢。
hdu2795 這個題需要查詢一段區間內第乙個大於等於x的數是誰。我們維護一段區間的最大值。如果最大值小於x,就返回沒有,否則看左右兒子的最大值,選擇其中乙個遞迴向下查詢。
其他例子待補充。。。
FBI樹兩種解法
問題描述 我們可以把由 0 和 1 組成的字串分為三類 全 0 串稱為b串,全 1 串稱為i串,既含 0 又含 1 的串則稱為f串。fbi樹是一種二叉樹,它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2n的 01 串s可以構造出一棵fbi樹t,遞迴的構造方法如下 1 t的根結點為r,其型...
RMQ的ST寫法和線段樹寫法兩種姿勢
rmq問題為求區間最值的問題 線段樹可以在o logn 的時間複雜度內完成詢問操作。但是st演算法可以在常數時間內完成詢問操作 st演算法 基於動態規劃求區間最值的演算法。分為預處理和查詢兩部分 預處理 定義 f i j 為從 i開始到 i 2 j 1 區間內的最值 我們可以講這段2 j的區間分成兩...
約瑟夫問題兩種實現方式
陣列版本 include include main int p int malloc len sizeof int printf 請輸入步長 n scanf d pace if pace 0 if pace 0 printf 請輸入進行輪數 n scanf d time printf 請輸入您想從那...