線段樹模板(陣列實現)

2021-08-30 02:02:49 字數 911 閱讀 6682

首先是基本定義環節

因為線段樹左子節點和右子節點在建構函式的時候比較常用 我們就把這兩個語句簡化一下;

#define lson l, m, rt<<1

#define rson m+1, r, rt<<1|1

const int maxn=5008;

int num[maxn<<2];

之後就是乙個更新函式 常用於線段樹某處更改數值之後

void pushup(int rt)//更新函式

接下來便是基本的初始化

void build( int l, int r, int rt)//選擇建立的範圍(l,r) 選擇根節點 rt

之後是詢問函式 用來求區間內最大值、最小值、區間和或者其他什麼奇奇怪怪和區間有關的東西 (不同需求要不同改造)

int qurey( int l, int r, int l, int r, int rt)//這裡的例子是求區間內之和 當然求別的可以改造

之後就是更改某個值了,更改乙個值 會對整個線段樹都造成影響,要特別注意更新

void updata( int p, /*int add*/,int l, int r, int rt)//更改操作

int m = ( l + r) >> 1;

if(p <= m) updata(p, lson);

else updata(p, rson);

pushup(rt);//更改乙個值之後 別忘記對整個線段樹進行更新。

}

以上就是乙個模板(感覺寫的比較簡陋)可以用來改造一下。

還可以用結構體來做,這種方法不是唯一的,只是我個人比較喜歡。

線段樹,樹狀陣列 模板

線段樹 一 建樹 開始建樹的時候為built 1,1,n void built int rt int l,int r rt為結點,初始值為1,l,r分別為左右端點 二 單點查詢 void query int rt,int p 初始結點值為1 三 單點修改 void add int rt,int p,...

線段樹(陣列實現)

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

線段樹的實現(模板)

線段樹 在一類問題中,我們需要經常處理可以對映在乙個座標軸上的一些固定線段,例如說對映在ox軸上的線段。由於線段是可以互相覆蓋的,有時需要動態地取線段的並,例如取得並區間的總長度,或者並區間的個數等等。乙個線段是對應於乙個區間的,因此線段樹也可以叫做區間樹。線段樹的構造思想 線段樹是一棵二叉樹,樹中...