日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组树模板

發布時間:2025/3/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组树模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

樹狀數組(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;?
}?

總結

以上是生活随笔為你收集整理的数组树模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。