主要解決兩個問題:(其他問題可以轉化)更新某一點的值;求區間值;時間按複雜度(logn)
原陣列a[1] a[2] …a[n];
寫成樹狀陣列c:c[x]=(x-lowbit(x),x] 左開右閉;
筆記
主要**
const int n=?;
int tr[n];
int lowbit(int x)
void add(int x,int v)
int sum(int x)
兩個基本操作:單點修改和區間查詢。
四個核心函式:pushup:用子節點資訊更新當前節點資訊;build:在一段區間上初始化線段樹;modify:單點修改;query:區間查詢;
用陣列儲存線段樹:x的父節點x>>1;x的左兒子:x<<1;x的右兒子x>>1|1.
核心**:
const
int n=
100010
;int n,m;
int w[n]
;struct nodetr[
4*n]
;void
pushup
(int u)
void
build
(int u,
int l,
int r)
;else
;int mid=l+r >>1;
build
(u<<
1,l,mid)
,build
(u<<1|
1,mid+
1,r)
;pushup
(u);}}
intquery
(int u,
int l,
int r)
void
modify
(int u,
int x,
int v)
}
線段樹和樹狀陣列
引入1 有n個數 n 50000 個數,m m 50000 次詢問。每次詢問區間l到r的數的和。要求輸出每一次詢問的結果.分析 1.用字首和問題進行求解 再開乙個陣列 暫且記為b n 設n個數所組成的陣列為a n b i 用來記錄從a 1 到a i 的所有數字的和 即 b 1 a 1 b 2 b 1...
線段樹和樹狀陣列
線段樹 segment tree 和樹狀陣列是兩種常用的資料結構。他們用來維護乙個區間內的操作,可以在 logn 的複雜度上進行查詢和修改。線段樹可以維護對乙個區間的查詢和修改,可以對區間進行分塊查詢,而樹狀陣列是線段樹的閹割版,經常用來區間查詢,但修改只能進行單點修改,經過改造之後可以區間修改,區...
樹狀陣列和線段樹(未完)
線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。效能 於tsinghua online judge,侵刪 題目描述 魔術師將一疊撲克順次在桌上排成一行,全部正面朝上。之後的每一次揮一揮衣袖,都會翻轉一連串的撲克,改變它們的正反朝向。從古代傳...