树状数组原理自high &&模板

本文详细介绍了如何将数组的结点序号转化为二进制,并利用这一转化进行高效求和运算。通过实例展示了二进制索引树的构建过程,以及如何使用lowbit函数快速获取特定区间的累加和。深入解析了代码实现细节,包括getsum和add函数的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 数组的结点序号转化为二进制

 

1=(001)      C[1]=A[1];

2=(010)      C[2]=A[1]+A[2];

3=(011)      C[3]=A[3];

4=(100)      C[4]=A[1]+A[2]+A[3]+A[4];

5=(101)      C[5]=A[5];

6=(110)      C[6]=A[5]+A[6];

7=(111)      C[7]=A[7];

8=(1000)    C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];

 C[i]=A[i-2^k+1]+A[i-2^k+2]+......A[i]; (k为i的二进制中从最低位到高位连续零的长度)例如i=8时,k=3;

代码 

int lowbit(   int t)

{

return  t&(-t);
}
//t=6(0110)
//-t=-6(1001+1)=
// t&(-t)=(0010)=2=2^1

//c[i]=c[i-lowbit(i)+1]+c[i-lowbit(i)+2]+....A[i];

int getsum(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
ans+=C[i];
return ans;
}

int getsum(int x)

{


 int ans=0;
for(int i=x;i>0;i-=lowbnit(i))
{
ans+=c[i];

}
return ans;
}


void add(int x,int y)
{
for(int i=x;i<=n;i+=lowbit(i))

   tree[i]+=y;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值