树状数组(BIT)

i的二进制的最后一个1可以通过i&(-i)得到,时间复杂度o(logn)。对于W*H的二维BIT只需要建立H个大小为x轴方向元素个数W的BIT,复杂度O(logW+logH)。同样的方法可以扩展到更高维度的情况。

 1 int sum(int i)

 2 {

 3     int s=0;

 4     while(i>0) {

 5         s+=bit[i];

 6         i-=i&(-i);

 7     }   

 8     return s;

 9 }

10 void add(int i,int x)

11 {

12     while(i<=n) {

13         bit[i]+=x;

14         i+=i&(-i);

15     }

16 }

17 

18 int main()

19 {

20     int x,y;

21     scanf("%d%d",&n,&m);

22     for(int i=1;i<=n;i++) {

23         scanf("%d",&a[i]);

24         add(i,a[i]);

25     }

26     while(m--) {

27         scanf("%d",&x);

28         printf("%d\n",sum(x));//前x项和

29     }

30     

31     return 0;

32 }

 

你可能感兴趣的:(树状数组)