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