基礎線段樹(建樹,查詢,單點更新)

2022-07-25 05:42:08 字數 1245 閱讀 8751

線段樹就是講一連串的數字轉換成樹的形式,有利於對資料進行操作,效率較高

下面是建樹操作

1

void build(int l,int r,int i)//

左節點 l 右節點 r 當前節點 i28

int m=(l+r)>>1,ls=i<<1,rs=ls|1

;// m 為中點 ls 為左兒子 rs 為右節點

9build(l,m,ls);//建立左子樹

10 build(m+1

,r,rs);//建立右子樹

11pushup(i);

//更新父節點 自定義函式

12 }

下面是線段樹查詢操作**

查詢操作根據不同的題目有不同的寫法(其實基本上都是相同的,只是有一點不同)

int query(int l,int r,int l,int r,int i)//

查詢的區間(l,r) 起始區間(l,r) 當前節點 i

int m=(l+r)>>1,ls=i<<1,rs=ls|1

;

int ans=0

;

if(l<=m)

ans+=query(l,r,l,m,ls);//求和

/*sum[i]=max(sum[i<<1],sum[i<<1|1];

求最值*/

if(r>m)

ans+=query(l,r,m+1

,r,rs);

/*sum[i]=max(sum[i<<1],sum[i<<1|1];

求最值*/

return

ans;

}

接下來是單點更新

void update(int k,int v,int l,int r,int i)//

需要更新的節點 k 更新後的數值 v 起始區間(l,r) 當前節點 i

int m=(l+r)>>1,ls=i<<1,rs=ls|1

;

//下面是遞迴操作,細細琢磨,有點二分的味道

if(k<=m)

update(k,v,l,m,ls);

else

update(k,v,m+1

,r,rs);

pushup(i);

//更新父節點

}

上面這個鏈結的部落格關於線段的 寫的很全面 

ps:第一次寫,不喜勿噴

線段樹 建樹 單點修改 單點 區間查詢

線段樹 sgement tree 是一種分治思想的二叉樹結構,用於在區間上進行資訊統計。與按照二進位制位進行區間劃分的樹狀陣列相比,線段樹是一種更加通用的結構 1.線段樹的每個節點都代表乙個區間。2.線段樹具有唯一的根節點,代表的區間是整個統計範圍,如 1,n 3.線段樹的每個葉節點都代表乙個長度為...

線段樹應用(建樹 單點更新 區間求和)

問題描述 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。輸入格式 輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1 a,b n k 0時表示將a處數字加上b,k 1時表示詢問區間 a,b 內所有數的和。輸出...

線段樹的建樹 更新 查詢操作

模板題sdut oj 3771 陣列計算機 description blue 有乙個神器的機器,這個機器可以讀入乙個陣列,並按照使用者要求快速地進行陣列的處理和計算,它支援如下兩種操作 操作 1 把陣列中第 p 個元素的值增加 v。操作 2 計算陣列中 l,r 區間內所有數的和。這個機器就是這麼的神...