树状数组(一维、二维)入门
2013-11-16 22:08
302 查看
(1).一维树状数组:一定要注意数组c的初始化,N是数组的大小,modify的功能是把第n个元素加上delta,
而sum的功能则是求从第一个元素开始到第n个元素之和,当然也可以求一段区间上的和,
比如我要求第x个元素到第y个元素的和,答案就是sum(y) - sum(x - 1)
HDU1556:更新a,b的区间=Update(a,n)-Update(b+1,n);
HDU1166:注意c
初始化(0),与a
是不同的变量;
(2).二维树状数组:同样不要忘记c的初始化,modify 的功能是改变元素(x, y),
sum的功能则是求从元素(1, 1)开始到(x, y)的总和,同样,可以求出任意一个子矩阵内的所有元素之和,
即sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1)
PKU1195
而sum的功能则是求从第一个元素开始到第n个元素之和,当然也可以求一段区间上的和,
比如我要求第x个元素到第y个元素的和,答案就是sum(y) - sum(x - 1)
int lowbit( int n ) { return n & (-n); } void modify( int n, int delta ) { while( n <= N ) { c += delta; n += lowbit(n); } } int sum( int n ) { int ret = 0; while( n != 0 ) { ret += c ; n -= lowbit(n); } return ret; }
HDU1556:更新a,b的区间=Update(a,n)-Update(b+1,n);
HDU1166:注意c
初始化(0),与a
是不同的变量;
(2).二维树状数组:同样不要忘记c的初始化,modify 的功能是改变元素(x, y),
sum的功能则是求从元素(1, 1)开始到(x, y)的总和,同样,可以求出任意一个子矩阵内的所有元素之和,
即sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1)
PKU1195
int lowbit( int x ) { return x & (-x); } void modify( int x, int y, int delta ) { int i, j; for(i=x; i<=N; i+=lowbit(i)) { for(j=y; j<=N; j+=lowbit(j)) { c[i][j] += delta; } } } int sum( int x, int y ) { int res = 0, i, j; for(i=x; i>0; i-=lowbit(i)) { for(j=y; j>0; j-=lowbit(j)) { res += c[i][j]; } } return res; }
相关文章推荐
- 树状数组的讲解感觉挺好,和我的一维,二维,树状数组的模板,希望对大家有用
- C#新手入门代码 将一维string数组转换成二维char类型输出并输出
- POJ-2155 Matrix (二维树状数组 入门题)
- 一维和二维树状数组
- 从一维树状数组到二维树状数组
- 树状数组的模板(一维和二维)
- 树状数组小结 【一维二维 常用操作】
- 一维二维树状数组区间加与区间求和
- 一维 + 二维树状数组 + 单点更新 + 区间更新 详解
- 【树状数组】树状数组一维二维模板
- 树状数组( 单点修改/区间修改+区间求和+一维/二维)
- poj 3067 Japan 二维树状数组(入门)
- 一维与二维树状数组
- poj 1195 (二维树状数组入门,模板题)
- 一维树状数组和二维树状数组和三维树状数组的区间更新单点求值
- 一维树状数组和二维树状数组
- poj 2029 二维树状数组入门
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
- 树状数组,一维,二维
- poj 2155 二维线段树或树状数组入门