學習筆記1-回顧樹狀數組與莫隊思路
阿新 • • 發佈:2017-10-23
size height 數據結構 sdn csdn net 復雜 ron 時間復雜度
今天回顧了一下樹狀數組的有關內容。
可以說是今天才看懂樹狀數組的意思吧。。對之前的理解毫無印象..
現在這裏馬克一下
樹狀數組:
樹狀數組是用於存儲數據的一種特殊的數據結構。具體的形狀如下圖:
a數組是我們宏觀普遍出現的數組形式,c就是相對的樹狀數組。
二進制條件下:
a[0]到a[1110]的和=c[1110]+c[0110]+c[0010];
修改a[1]時,受到影響的有c[1],c[10],c[100],c[1000].....
對於這樣的運算,我們用到了&來計算。
lowbit();的作用是去掉高位1 (1100就是0100,1110就是0010,1000就是本身)
lowbit(k)=k&-k;
所以修改和讀取的操作分別是:
void add(int k,int num) { while(k<=n) { tree[k]+=num; k+=k&-k; } } //修改 int read(int k)//1~k的區間和 { int sum=0; while(k) { sum+=tree[k]; k-=k&-k; } return sum; } //讀取
當然,有一些時候數據會讓你難以使用樹狀數組。比如,求區間中不同的數的個數(多次修改,多次詢問),這個時候就可以用莫隊來解決了~~
等我看完莫隊再來補筆記....
樹狀數組時間復雜度O(lg n)
學習筆記1-回顧樹狀數組與莫隊思路