線段樹簡單實現

2021-08-28 02:31:40 字數 811 閱讀 2495

首先,線段樹是一棵滿二叉樹。(每個節點要麼有兩個孩子,要麼是深度相同的葉子節點)

每個節點維護某個區間,根維護所有的。

如圖,區間是二分父的區間。

當有n個元素,初始化需要o(n)時間,對區間操作需要o(logn)時間。

下面給出維護區間最小值的思路和**

從下往上,每個節點的值為左右區間較小的那乙個即可。

這算是簡單動態規劃思想,做到了o(n),因為每個節點就訪問一遍,而葉子節點一共n個,所以訪問2n次即可。

如果利用深搜初始化,會到o(nlogn)。

有介紹不要以為它是二分區間就只能查二分的那些區間,它能查任意區間。

比如上圖,求1-7的最小值,查詢1-4,5-6,7-7即可。

下面說過程:

遞迴實現:

如果要查詢的區間和本節點區間沒有重合,返回乙個特別大的數即可,不要影響其他結果。

如果要查詢的區間完全包含了本節點區間,返回自身的值

都不滿足,對左右兒子做遞迴,返回較小的值。

更新ai,就要更新所有包含ai的區間。

可以從下往上不斷更新,把節點的值更新為左右孩子較小的即可。

注:沒有具體的初始化,dp思路寫過了,實在不想寫了

初始全為int_max

const int max_n=1<<7;

int n;

int tree[2*max_n-1];

//初始化

void gg(int nn)

//更新

void update(int k,int a)//第k個值更新為a

}

RMQ(線段樹實現)

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

線段樹GO實現

var sum int var lazytint var arrint 改變了區間中某乙個值或某些值時,我們需要沿著線段樹向上更新改變值的節點與根節點間的所有值,可以看出這部操作與線段樹的高度有關,複雜度為o logn func pushup idx int build func build lef...

線段樹(陣列實現)

最近看了很多學長髮的資料,吸取了別人的優點,把query函式更改的更加合理了。我是分割線 線段樹是一棵完美二叉樹,樹上的每個節點都維護乙個區間。根維護的是整個區間,每個節點維護的是父親的區間二等分後的其中乙個子區間。當有n個元素時,對區間的操作可以在o logn 的時間內完成。所以,線段樹是擅長處理...