树状数组(二叉索引树)

树状数组(二叉索引树BIT)

  1. 针对动态连续和查询问题。
    对于数组{A1,A2,A3,…An},有操作如下:
    Add(x, d):让Ax增加d;Query(L, R):计算A中第L个数到第R个数的和(S[R] - S[L - 1])。
  2. lowbit(x):x的二进制表达式中最右边1所对应的值。
    -x:x按位取反,末尾加1。(补码表示)
    → lowbit(x) = x & -x ;
  3. 这里写图片描述
    黑色结点:BIT中的结点;
    以黑色结点结尾的长条:A中的一段连续和。C[i] = A[i - lowbit(i) + 1] + A[i - lowbit(i) + 2] + … + A[i]
    前缀和S[i]:从结点i出发,沿左上走经过的C之和。
    修改A[i]:从结点i开始,沿右上修改经过的C。
  4. 函数代码:
inline int lowbit(int x)
{
    return x & -x;
}
inline void add(int x, int d)
{
    for(; x <= n; x += lowbit(x)) c[x] += d;
}
inline int sum(int x)
{
    int s = 0;
    for(; x; x -= lowbit(x)) s += c[x];
    return s;
}
  • 时间复杂度: 每个操作:O(log n);总操作:O(n * log n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值