ural 1470 UFOs [树状数组]

本文介绍了一种使用树状数组解决三维空间中点值更新和区间查询的问题,通过差值技巧实现高效的实时操作处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

对(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][N][N], 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);
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值