树状数组入门 (记录一下

首先我们要明白

树状数组和线段树很像,但能用树状数组解决的问题,基本上都能用线段树解决,而线段树能解决的树状数组不一定能解决。相比较而言,树状数组
效率要高很多。但使用范围比线段树小(如查询每个区间最小值问题需要线段树)。
树状数组的图解
这里写图片描述
c1 = a1

c2 = a1 + a2

c3 = a3

c4 = a1 + a2 + a3 + a4

c5 = a5

c6 = a5 + a6

c7 = a7

c8 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
对于序列a,我们设一个数组C定义C[i] = a[i – 2^k + 1] + … + a[i],k为i在二进制下末尾0的个数

树状数组的代码量非常短 核心三个函数 只有10行左右 但是很不好理解
博主也没有理解所以在这里记录一下

三个核心函数

求解的是二进制最低位的 1 1 <script type="math/tex" id="MathJax-Element-5">1</script>的位置是多少

int lowbit(int x) 
{
    return x&(-x); 
}

将a[p]上加一个值x(如果减去取-x即可,即更新C数组

void update(int p, int x)
{
    while(p <= n) {
        c[p] += x;
        p += lowbit(p);
    }
}

求前p项的和

int sum(int p)
{
    int sum = 0;
    while(p > 0) {
        sum += c[p];
        p -= lowbit(p);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值