码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组模版

时间:2015-06-07 20:12:05      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

原来听到树状数组这名字感觉很难,很高大上。学了一下发现不难。而且很好。

普通的数组修改某个值耗费为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 }
View Code

 

树状数组模版

标签:

原文地址:http://www.cnblogs.com/sweat123/p/4558895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!