您的位置:首页 > 其它

树状数组(一维、二维)入门

2013-11-16 22:08 302 查看
(1).一维树状数组:一定要注意数组c的初始化,N是数组的大小,modify的功能是把第n个元素加上delta,

而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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: