線段樹就是講一連串的數字轉換成樹的形式,有利於對資料進行操作,效率較高
下面是建樹操作
1void 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 區間內所有數的和。這個機器就是這麼的神...