首先是基本定義環節
因為線段樹左子節點和右子節點在建構函式的時候比較常用 我們就把這兩個語句簡化一下;
#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軸上的線段。由於線段是可以互相覆蓋的,有時需要動態地取線段的並,例如取得並區間的總長度,或者並區間的個數等等。乙個線段是對應於乙個區間的,因此線段樹也可以叫做區間樹。線段樹的構造思想 線段樹是一棵二叉樹,樹中...