[数据结构] 树状数组 的C程序实现

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;
}

 

posted @ 2018-05-09 09:01  Oran  阅读(269)  评论(0编辑  收藏  举报