树状数组[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 }

猜你喜欢

转载自www.cnblogs.com/kohano/p/11746271.html