标签:
原来听到树状数组这名字感觉很难,很高大上。学了一下发现不难。而且很好。
普通的数组修改某个值耗费为O(1),输出和为O(n);而树状数组为O(logn);
lowbit(x)
{
return x&(-x);
}
返回的是x二进制最后一位1的位置;
有公式:cn=a(n-a^k+1)+.........+an(其中 k 为 n 的二进制表示中从右往左数的 0 的个数)。
模版
1 #include<stdio.h> 2 #include<string.h> 3 int a[1000],n; 4 int lowbit(int x) 5 { 6 return x&(-x); 7 } 8 void update(int i,int val) 9 { 10 while(i<=n) 11 { 12 a[i]+=val; 13 i+=lowbit(i); 14 } 15 } 16 int Sum(int i) 17 { 18 int sum=0; 19 while(i>0) 20 { 21 sum+=a[i]; 22 i-=lowbit(i); 23 } 24 return sum; 25 } 26 int main() 27 { 28 int i,j; 29 while(scanf("%d",&n)!=EOF) 30 { 31 for(i=1;i<=n;i++) 32 { 33 int val; 34 scanf("%d",&val); 35 update(i,val); 36 } 37 for(i=1;i<=n;i++) 38 printf("%d ",a[i]); 39 printf("\n"); 40 int ans=Sum(3); 41 printf("%d\n",ans); 42 //update(1,3); 43 //ans=Sum(3); 44 //printf("%d\n",ans); 45 } 46 }
标签:
原文地址:http://www.cnblogs.com/sweat123/p/4558895.html