java 树状数组模板源码

树状数组是一个查询和修改复杂度都为log(n)的数据结构,将树状数组看成一种数据结构,对于一个数组,如果有多次操作,每次的操作有两种:1、修改数组中某一元素的值,2、求和,求数组元素a[1]+a[2]+…a[num]的和,这是树状数组最基本的应用了。


  1. //二维树状数组  
  2. const int maxn = 1050;  
  3. int c[maxn][maxn];  
  4. int n;  
  5. int lowbit(int x) {  
  6.     return x&(-x);  
  7. }  
  8. //设原始矩阵为matrix,将matrix[x][y]加上val对c矩阵所做的修改  
  9. void add(int x, int y, int val) {  
  10.     int i=y;  
  11.     while (x<=n) {  
  12.         y=i;  
  13.         while (y<=n) {  
  14.             c[x][y]+=val;  
  15.             y+=lowbit(y);  
  16.         }  
  17.         x+=lowbit(x);  
  18.     }  
  19. }  
  20. //求matrix子矩阵的(1,1)到(x,y)的和  
  21. int get_sum(int x, int y) {  
  22.     int i=0,j=y;  
  23.     while (x>0) {  
  24.         y=j;  
  25.         while (y>0) {  
  26.             i+=c[x][y];  
  27.             y-=lowbit(y);  
  28.         }  
  29.         x-=lowbit(x);  
  30.     }  
  31.     return i;  
  32. }  
  33. //一维树状数组  
  34. //计算lowbit  
  35. int lowbit(int x) {  
  36.     return x&(-x);  
  37. }  
  38. //设原始矩阵为a,将a[i]加上val时对c所做的修改  
  39. void add(int i, int val) {  
  40.     while (i<=n) {  
  41.         c[i]+=val;  
  42.         i+=lowbit(i);  
  43.     }  
  44. }   
  45. //求前i项元素的和  
  46. int get_sum(int i) {  
  47.     int sum=0;  
  48.     while (i>0) {  
  49.         sum+=c[i];  
  50.         i-=lowbit(i);  
  51.     }  
  52.     return sum;  
  53. }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值