1. 程式人生 > >[數據結構] 樹狀數組 的C程序實現

[數據結構] 樹狀數組 的C程序實現

有用 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(int
x,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程序實現