POJ 1195 二维树状数组

来源:互联网 发布:全文免费阅读软件 编辑:程序博客网 时间:2024/04/27 17:52

这道题教我们怎么使用二维的树状数组。
#include <cstdio>

int lowerbit(int a)
{
return (a ^ (a & (a - 1)));
}

int n,c[1025][1025];

void add(int x,int y,int delta)
{
int y_save = y;
for (; x <= n; x += lowerbit(x))
{
y = y_save;
for (; y <= n; y += lowerbit(y))
{
c[x][y] += delta;
}
}
}

int getsum(int x,int y)
{
if (!x || !y)
{
return 0;
}

int sum = 0;
int y_save = y;
for (; x > 0; x -= lowerbit(x)) //&=~lowbit(x)
{
y = y_save;
for (; y > 0; y -= lowerbit(y))//&=~lowbit(x)
{
sum += c[x][y];
}
}

return sum;
}

int getsum(int x0,int y0,int x1,int y1)
{
return getsum(x1,y1) - getsum(x0 - 1,y1) - getsum(x1,y0 - 1) + getsum(x0 - 1,y0 - 1);
}

int main(void)
{
int i,j,x0,y0,x1,y1,t,delta;
while (EOF != scanf("%d",&t))
{
if (t == 0)
{
scanf("%d",&n);
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
{
c[i][j] = 0;
}
}
else if (t == 1)
{
scanf("%d%d%d",&x0,&y0,&delta);
if (delta)
{
add(x0 + 1,y0 + 1,delta);
}
}
else if (t == 2)
{
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
printf("%d/n",getsum(x0 + 1,y0 + 1,x1 + 1,y1 + 1));
}
else
{
continue;
}
}
return 0;
}

原创粉丝点击