首页 > 编程语言 > 详细

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

时间:2018-05-09 10:01:47      阅读:210      评论:0      收藏:0      [点我收藏+]
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程序实现

原文:https://www.cnblogs.com/OranBlog/p/9012351.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!