線段樹是一種二叉樹,可以快速的查詢區間和,解決區間類問題
節點i,左邊界l,有邊界r,區間和的值tree[i]=tree[i<<1]+tree[i<<1|1]
左兒子節點下標i<<1,左邊界l,右邊界l+(r-l)>>1
右兒子節點下標i>>1|1,左邊界l+(r-l)>>1|1,右邊界r
因為每個節點i的左右邊界已經確定,所以不用特意的使用結構體儲存l,r,只需要在遞迴的時候動態變化即可
#includeusing namespace std;
// 建樹:
const int maxn = 100005;
int arr[maxn],tree[maxn<<2]; //arr為原來區間,tree為線段樹
//遞迴⽅式建樹 build(1,1,n);
void build(int k,int l,int r)
}//遞迴方式區間查詢 query(l,r,1,n,1);
int query(int l,int r,int l,int r,int k)
else
}int main()
build(1,1,10);
cout這裡求2-4區間和,結果:
線段樹建樹
線段樹是一種二叉樹,也就是說,每個線段都可以用一二叉樹表示 比如乙個長度為4的線段可以如此表示 4 1 2 3 4 1 2 3 4 如果你要表示線段上的和,最上面的根表示線段1 4的和 下面兩個子節點表示1 2,3 4的和,以此類推 卐 然後我們還可以得到乙個性質 節點i的權值 她的左兒子權值 她的...
線段樹 建樹 單點修改 單點 區間查詢
線段樹 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 內所有數的和。輸出...