零、樹狀陣列的基本概念
1.概念:
2.實現原理:
3.特性:
1.概念
這是樹狀陣列最基本的應用,也就是支援單點修改區間查詢(時間複雜度均為
)2.實現原理
3.具體實現:
不停獲取i的二進位制表示中的最後一位1所代表的值(將這個值設為b)
在操作過程中(在迴圈中給i增加b之前),向c陣列中下標為i的地方增加x
進行i+b這個操作(這使得i的值在最壞情況下也會在
次達到(估算))
判斷i的值是否到n
準備進行兩次求字首和的操作(假設要獲取區間a[i...j]的總值,則計算
即可,也就是求兩次字首和)
(單次求字首和操作過程與單點查詢恰好相反)(下面只寫求單次字首和的過程,具體可看**.)
初始化ans=0,準備用於儲存查詢結果
不停獲取i的二進位制表示中的最後一位1所代表的值(將這個值設為b)
在操作過程中(在迴圈中給i減少b之前),向ans增加x
進行這個操作(這使得i的值在最壞情況下也會在
次達到(估算))
判斷i的值是否到0
#include#includeusing namespace std;int n,c[500010];
int lowbit(int x)
void add(int x,int k)
int sum(int x,int y)
for(x--;x;x-=lowbit(x))
return ans;
}int main()
for(int i=1;i<=m;i++)else if(ta==2)
long long query(int x)
return ans;
}int main()
for(int i=1;i<=m;i++)else if(ta==2)
}return 0;
}
關於樹狀陣列
身為蒟蒻的我 終於學會了 樹狀陣列 但因為自己還是太蒟蒻 還是糊里糊塗的 所以寫個部落格理理思路 樹狀陣列的數學模型 樹狀陣列的劃分依據的原理是任何正整數都可以表示為2的冪相加的形式 如13 2 3 2 2 2 1 進而可以利用這一特性來進行區間求和 設想一下現在乙個序列 長度為n 現在要進行區間求...
關於樹狀陣列
樹狀陣列 binary indexed tree b.i.t fenwick tree 是乙個查詢和修改複雜度都為log n 的資料結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改乙個元素的值 經過簡單修改可以在log n 的複雜度下進行範圍修改,但是這時只能查詢其中乙個元素的值 如果...
關於樹狀陣列
樹狀陣列的核心在於對一段區間的修改和查詢,巧妙地把陣列用一顆樹表示,從而降低了對陣列的修改和查詢的複雜度。首先引入lowbit int lowbit x 如 x 1 1 0000 0001 1111 1111 1 x 6 6 6 0000 0110 1111 1010 2 總結一下就是 求出某個數二...