您的位置:首页 > 其它

ural 1470 UFOs [树状数组]

2013-04-08 15:58 375 查看
题意:

对(0,0,0)到(128,128,128)的三维空间进行三种操作:(1)在点(x,y,z)增加V(可能为负);(2)查询(x1,y1,z1)到(x2,y2,z2)的数量和;(3)退出

三种操作是实时的。

思路:

可以向上一题一样采用线段树,但是需要三重线段树,编程复杂度有点高,于是简单的树状数组,查询的时候用差值。树状数组这里讲得比较清楚:click me

#include <cstdio>
#include <cstring>
#define N 130
int c

, n;
void update(int px, int py, int pz, int val)
{
int x=px, y=py, z=pz;
while (x <= n)
{
y = py;
while (y <= n)
{
z = pz;
while (z <= n)
{
c[x][y][z] += val;
z += z&(-z);
}
y += y&(-y);
}
x += x&(-x);
}
}
int quary(int px, int py, int pz)
{
int ret=0, x=px, y=py, z=pz;
while (x > 0)
{
y = py;
while (y > 0)
{
z = pz;
while (z > 0)
{
ret += c[x][y][z];
z -= z&(-z);
}
y -= y&(-y);
}
x -= x&(-x);
}
return ret;
}
int main()
{
while (scanf("%d",&n) != EOF)
{
int tag;
while (scanf("%d",&tag) && tag!=3)
{
if (tag == 1)
{
int x1,y1,z1,v;
scanf("%d%d%d%d",&x1,&y1,&z1,&v);
update(x1+1,y1+1,z1+1,v);
}
else if (tag == 2)
{
int x1,y1,z1,x2,y2,z2,v;
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
v = quary(x2+1,y2+1,z2+1)
- quary(x2+1,y2+1,z1) - quary(x2+1,y1,z2+1) - quary(x1,y2+1,z2+1)
+ quary(x1,y1,z2+1) + quary(x1,y2+1,z1) + quary(x2+1,y1,z1)
- quary(x1,y1,z1);
printf("%d\n", v);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: