数状数组

数状数组

数状数组求解:

下图是数状数组C和原数组a

数状形数组的规律:

C1=a1
C2=a1+a2
C3=a3
C4=a1+a2+a3+a4
C5=a5
……
C8=a1+a2+a3+a4+a5+a6+a7+a8
……
C2n=a1+a2+….+a2^n
本质:对于序列a,数组C中的第x个元素为
 
C[x] = a[x – 2k+ 1] + … + a[x]
 
 
 K i的二进制表示中末尾0的个数
      
1) 与x对应的2k的计算
 
int lowbit ( int x )
{return x & (-x); } 
2) a[k]增加d时,数组C中相应元素的修改
 
void change(int k,int d,int n)
//n是数组的最大下标
{while (k<=n)
{c[k]=c[k]+d;
k=k+lowbit(k);}
}
 
3)计算a[1]+a[2]+……+a[K]
int getsum(int k)
{int t=0;
while (k>0)
{t=t+c[k];
k=k-lowbit(k);
}
return t;
}

 
完整代码:
#include <iostream>
using namespace std;
#define N 100
int a[N],c[N];
int lowbit(int x)
{return x & (-x); }
void change(int k,int d,int n)
{while (k<=n)
{c[k]=c[k]+d; k=k+lowbit(k); } 
}
int getsum(int k)
{int t=0;
while (k>0)
{t=t+c[k];k=k-lowbit(k);}
return t;
}
 
int main( )
{         int i,n=8;
          memset(c,0,sizeof(c));
for (i=1; i<=n; i++)
{  a[i]=i;change(i,i,n);}for (i=1; i<=n; i++)
cout<<a[i]<<" "<<c[i]<<" "<<getsum(i)<<endl;
a[3]=a[3]+50;
          change(3,50,8);
for (i=1; i<=n; i++)
cout<<a[i]<<" "<<c[i]<<" "<<getsum(i)<<endl;
return 0;
}

 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值