樹狀陣列和線段樹一樣,也是乙個結點表示乙個段,只不過線段樹是採用二分思想來表示乙個線段,而樹狀陣列不是。對於原資料a,樹狀陣列tr,tr[n]=tr[n-2^k+1]+...+tr[n],其中k是n在二進位制下末尾0的個數,2^k可通過x&(-x)來獲得。樹狀陣列的適用性約束較大,一般用於對點更新(o(logn)),對區間查詢(o(logn)),而不建議用來對區間更新(o(nlogn)),還不如在原陣列上操作(o(n)),不建議對點查詢。而且必須滿足減法規則才能使用樹狀陣列,即比如求和就滿足sum(a,b)=sum(1,b)-sum(1,a-1),而求最大值就不滿足減法規則。
在很多情況下線段樹都可以用樹狀陣列實現,凡是能用樹狀陣列實現的都可以用線段樹實現。樹狀陣列相比線段樹來說更節省空間且複雜讀更低,但侷限性稍大。
樹狀陣列和線段樹都在題目要求進行頻繁的修改和查詢操作時使用。線段樹的使用更靈活,主要是考慮每個結點需要記錄什麼,這個記錄的值在修改過程需要怎麼維護。線段樹之所以存在的理由是因為它能適用於很多方面,不僅僅是區間、單點的查詢修改,還有標記等等,可以用於模擬、dp等等,而且空間經過離散化以後也可以相對壓縮,所以適用範圍線段樹更加廣一些。
ac**:
#include#includeusing
namespace
std;
inline
intread()
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
return f?-x:x;
}int n,m,tr[500005
];int lowbit(int
x)void update(int pos,int
num)
}int query(int
pos)
return
ans;
}int
main()
while(m--)
return0;
}
模板 樹狀陣列1
這篇是樹狀陣列模板1 主要內容有 1.將某數加上x 2.求某區間和 也就是說支援單點修改 關於樹狀陣列的部落格講解 見基本介紹 include include include using namespace std define in read typedef long long ll const ...
模板 樹狀陣列 1
題目鏈結 如題,已知乙個數列,你需要進行下面兩種操作 第一行包含兩個正整數 n,m,分別表示該數列數字的個數和操作的總個數。第二行包含 n 個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來 m 行每行包含 3 個整數,表示乙個操作,具體如下 輸出包含若干行整數,即為所有操作 ...
模板 樹狀陣列1
洛谷p3374樹狀陣列 1 能夠用樹狀陣列維護的值必須滿足區間加 將兩個區間合併 和區間減 將乙個區間拆開 例 區間和可以加減,但區間最值只能加不能減 樹狀陣列的作用是動態維護區間資料和動態查詢,基本用途是維護區間和 以下講解都以區間和為例 lowbit運算 lowbit n 定義為非負整數n在二進...