[數據結構] 樹狀數組 的C程序實現
阿新 • • 發佈:2018-05-09
有用 binary 二分 樹狀 IT 數據結構 實現 特殊 turn
int tree[100001];//樹狀數組,用於取區間[x,y]的數據的和 /* & 特殊運算,t&(-t)的值(十進制),就是t在2進制下,從右往左數第一個1出現的位置。 結合樹狀數組的特殊性質,這個值有用 */ int lowbit(int t) { return t&(-t); } /* 假設對處在數組序號x的數據進行了更改,讓x位置的數據有了增量v 對樹狀數組進行如下修改,使相關的包含x位數據的和都增加v 根據樹狀數組的性質,也就是對下標為 x, x+lowbit(x), x+lowbit(x+lowbit(x))....的數據都加v */ void add(intx,int v) { for(int i=x; i<=100000; i+=lowbit(i)) tree[i]+=v; } /* 取區間[0,x]的數據的和 */ int getsum(int x) { int ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i]; return ans; } /* 二分查找,進一步減少時間復雜度 */ int binarySearch(int l, int r, int median) { int mid ; while (l<=r) { mid= (l+r)/2; if (getsum(mid)<median) l = mid+1; //註意此處是 >= else if (getsum(mid)>=median) r = mid-1; else return mid; } return l; }
[數據結構] 樹狀數組 的C程序實現