URAL 1470. UFOs 三维树状数组

题目来源:URAL 1470. UFOs

题意:求三维区间和

思路:

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 130;
int a[maxn][maxn][maxn];
int b[maxn][maxn][maxn];
int n, q;

int lowbit(int x)
{
	return x & -x;
}
void update(int x, int y, int z, int num)
{
	for(int i = x; i <= n; i += lowbit(i))
		for(int j = y; j <= n; j += lowbit(j))
			for(int k = z; k <= n; k += lowbit(k))
			{
				a[i][j][k] += num;
			}

}
int sum(int x, int y, int z)
{
	int ans = 0;
	for(int i = x; i > 0; i -= lowbit(i))
		for(int j = y; j > 0; j -= lowbit(j))
			for(int k = z; k > 0; k -= lowbit(k))
			{
				ans += a[i][j][k];
			}
	return ans;
}
int main()
{

	scanf("%d", &n);
	while(scanf("%d", &q) && q != 3)
	{
		if(q == 1)
		{
			int x, y, z, k;
			scanf("%d %d %d %d", &x, &y, &z, &k);
			x++, y++, z++;
			if(b[x][y][z]+k >= 0)
		 	{
			 	update(x, y, z, k);
				b[x][y][z] += k;
		 	}
		 	else
		 	{
		 		update(x, y, z, b[x][y][z]);
		 		b[x][y][z] = 0;
		 	}
		}
		else if(q == 2)
		{
			int x1, y1, z1, x2, y2, z2;
			scanf("%d %d %d %d %d %d", &x1, &y1, &z1, &x2, &y2, &z2);
			x1++, y1++, z1++, x2++, y2++, z2++;
			int ans = sum(x2, y2, z2)-sum(x1-1, y2, z2)-sum(x2, y1-1, z2)+sum(x1-1, y1-1, z2)
				-(sum(x2, y2, z1-1)-sum(x1-1, y2, z1-1)-sum(x2, y1-1, z1-1)+sum(x1-1, y1-1, z1-1));
			printf("%d\n", ans);
		}
	}
	return 0;
}

URAL 1470. UFOs 三维树状数组

时间: 2024-11-09 20:16:02

URAL 1470. UFOs 三维树状数组的相关文章

HDU 3584 Cube (三维树状数组)

Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. Initially we have A[i, j, k] = 0 (1 <= i, j, k <= N). We define two operations, 1: "Not"

HDU 3584 Cube (三维 树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584 Cube Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. Initially we have A[i, j, k] = 0 (1 <= i, 

HDU 3584 Cube 【 三维树状数组 】

题意:还是那篇论文里面讲到的,三维树状数组http://wenku.baidu.com/view/1e51750abb68a98271fefaa8画个立方体出来对照一下好想一点 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<

hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板

先贴自己类比二维树状数组写的三维树状数组模板: 开始的时候循环体内j=y,k=z,没写,以为自己思路错了,,,hehe..... 更高维的树状数组以此类比 const int MAXN = 100+10; int c[MAXN][MAXN][MAXN];int X,Y,Z; int N; inline int lowbit(int x){return x&(-x);} void update(int x, int y, int z, int v) { int i=x,j=y,k=z; while

HDU 3584 Cube(三维树状数组)

Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 1660    Accepted Submission(s): 865 Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the numbe

HDU 3584 Cube --三维树状数组

题意:给一个三维数组n*n*n,初始都为0,每次有两个操作: 1. 翻转(x1,y1,z1) -> (x2,y2,z2) 0. 查询A[x][y][z] (A为该数组) 解法:树状数组维护操作次数,一个数被操作偶数次则相当于没被操作. 每次更新时在8个位置更新: .相当于8个二进制数:000,001,010,011,100,101,110,111. (我是由二维推过来的) 其实不用有的为-1,直接1也行,因为反正会改变奇偶性. 代码: #include <iostream> #inclu

hdu 3584 三维树状数组

/**************************************************************************************************** 题意:在一个三维长方体里把0元素改成1或者把1改成0或者询问某个位置是0还是1. 分析: 非树状数组莫属,其他数据结构都太帅了,用不着. 先说说一维上的树状数组,什么问题都得成最简单的开始,理解后才能推广到多维或复杂的. 把对某个方体的修改操作看做是对某个方体的操作数+1,那一个位置操作数的奇偶

Ural 1028. Stars(树状数组)

题目链接:点击打开链接 思路: 为了满足第一个条件, 我们可以先按照x坐标排序,  然后我们用树状数组来维护y坐标大小关系, 就可以在O(nlogn)的时间内求出答案了. 细节参见代码: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <string> #include <vector> #include &l

HDU - 3584 Cube (三维树状数组 + 区间改动 + 单点求值)

HDU - 3584 Cube Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. I