树状数组--简单讲解

在这里插入图片描述
C [ 1 ] = A [ 1 ] ; C[1]=A[1]; C[1]=A[1];
C [ 2 ] = A [ 1 ] + A [ 2 ] ; C[2]=A[1]+A[2]; C[2]=A[1]+A[2];
C [ 3 ] = A [ 3 ] ; C[3]=A[3]; C[3]=A[3];
C [ 4 ] = A [ 1 ] + A [ 2 ] + A [ 3 ] + A [ 4 ] ; C[4]=A[1]+A[2]+A[3]+A[4]; C[4]=A[1]+A[2]+A[3]+A[4];
C [ 5 ] = A [ 5 ] ; C[5]=A[5]; C[5]=A[5];
C [ 6 ] = A [ 5 ] + A [ 6 ] ; C[6]=A[5]+A[6]; C[6]=A[5]+A[6];
C [ 7 ] = A [ 7 ] ; C[7]=A[7]; C[7]=A[7];
C [ 8 ] = A [ 1 ] + A [ 2 ] + A [ 3 ] + A [ 4 ] + A [ 5 ] + A [ 6 ] + A [ 7 ] + A [ 8 ] ; C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8]; C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];

C [ i ] C[i] C[i] 就是 i i i 的前 x x x 位的 A [ j ] A[j] A[j] 的和, x x x i i i 二进制最低位 1 1 1 2 2 2 次方,如:
C [ 6 ] C[6] C[6] 6 = 0110 6=0110 6=0110,所以就是前 2 2 2 位, C [ 6 ] = A [ 5 ] + A [ 6 ] C[6]=A[5]+A[6] C[6]=A[5]+A[6] C [ 8 ] C[8] C[8] 8 = 1000 8=1000 8=1000,所以就是前 8 8 8

然后知道怎么找 i i i 的最低位 1 1 1,就是 lowbit(x)=(x&-x),原理略

之后看 S u m Sum Sum 函数,就是不断减掉最低位的 1 1 1,因为 C [ i ] C[i] C[i] i i i x x x A [ j ] A[j] A[j] 的和,如:
S u m ( 6 ) : 0110 − > 0100 − > 0000 Sum(6): 0110 -> 0100 -> 0000 Sum(6):0110>0100>0000

再就是 A d d Add Add 函数,就是不断加上最低位的 1 1 1,因为 C [ j ] C[j] C[j] 的和里面有 A [ i ] A[i] A[i] 如:
A d d ( 5 ) : 0101 − > 0110 − > 1000 Add(5): 0101 -> 0110 -> 1000 Add(5):0101>0110>1000

int lowbit(int x)
{
	return x&-x;
}
int Sum(int x)
{
	int tot=0;
	while(x) tot+=c[x],x-=lowbit(x);
	return tot;
}
void Add(int x,int y)
{
	while(x) c[x]+=y,x+=lowbit(x);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值