树状数组[BIT]
Posted kohano
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组[BIT]相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 using namespace std; 3 const int maxn=10000; 4 int a[maxn]; 5 int c[maxn]; 6 7 void make_c(int i){ 8 int x=i&(-i); //2^xi=i&(-i);求区间范围大小,x=2^xi 9 for(int left=i-x+1;left<=i;left++) //区间范围[i-2^x+1,i] 10 { 11 c[i]=c[i]+a[left]; //c[i]表示该区间范围内的元素之和 12 } 13 } 14 15 void updata(int i,int num,int n){ //将a[i]更改为new,更新c[i]数组 16 while(i<=n) 17 { 18 c[i]=c[i]+num; 19 i=i-i&(-i); 20 } 21 } 22 23 int sum(int i){ //前i个元素求和 24 int s=0; 25 while(i>0) 26 { 27 s+=c[i]; 28 i-=i&(-i); 29 } 30 return s; 31 } 32 33 int main(){ 34 int n; 35 cin>>n; 36 for(int i=1;i<=n;i++) 37 { 38 cin>>a[i]; 39 } 40 for(int i=1;i<=n;i++) 41 { 42 make_c(i); 43 } 44 int ans=sum(4); 45 cout<<ans<<endl; 46 for(int i=1;i<=n;i++) 47 cout<<c[i]<<" "; 48 return 0; 49 }
以上是关于树状数组[BIT]的主要内容,如果未能解决你的问题,请参考以下文章