数组树模板
樹狀數組(Binary Indexed Tree(BIT), Fenwick Tree)是一個查詢和修改復雜度都為log(n)的數據結構。主要用于查詢任意兩位之間的所有元素之和,但是每次只能修改一個元素的值;經過簡單修改可以在log(n)的復雜度下進行范圍修改,但是這時只能查詢其中一個元素的值。這種數據結構(算法)并沒有C++和Java的庫支持,需要自己手動實現。在Competitive Programming的競賽中被廣泛的使用。樹狀數組和線段樹很像,但能用樹狀數組解決的問題,基本上都能用線段樹解決,而線段樹能解決的樹狀數組不一定能解決。相比較而言,樹狀數組效率要高很多。
?
?
int lowbit(int x) //取x的最低位1,比如4,則返回4,如5,則返回1?
{?
??? return x&(-x);?
}?
?
void update(int i, int val)? //將第i個元素增加val?
{?
??? //i的祖先都要增加val?
??? while(i <= n)?
??? {?
??????? sum[i] += val;?
??????? i += lowbit(i);?? //將i的二進制未位補為得到其祖先?
??? }?
}?
?
int Sum(int i)?? //求前i項的和?
{?
??? int s = 0;?
??? //將前i項分段?
??? while(i > 0)?
??? {?
??????? s += sum[i];?
??????? i -= lowbit(i);? //去掉i的二進制最后一個?
??? }?
??? return s;?
}?
int lowbit(int x)?
{?
??? return x&(-x);?
}?
?
void update(int x, int y, int val) //將 a[x][y] 的值增加val?
{?
??? for(int i=x; i<N; i+=lowbit(i))?
??? {?
??????? for(int j=y; j<N; j+=lowbit(j))?
??????? {?
??????????? sum[i][j] += val;?
??????? }?
??? }?
}?
?
? //二維樹狀數組
int getSum(int x, int y) //求以1,1為左上角端點,學校,x,y為右下角端點的矩陣和.?
{?
??? int s = 0;?
??? for(int i=x; i>0; i-=lowbit(i))?
??? {?
??????? for(int j=y; j>0; j-=lowbit(j))?
??????? {?
??????????? s += sum[i][j];?
??????? }?
??? }?
??? return s;?
}?
總結
- 上一篇: 【视频教程】捷微开发视频系统讲课-陆续更
- 下一篇: 杭电Color the ball1556