您的位置:首页 > 理论基础 > 数据结构算法

HDU 3584 Cube(三维树状数组)

2016-10-10 00:13 369 查看
问题描述:

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” operation that we change the A[i, j, k]=!A[i, j, k]. that means we change A[i, j, k] from 0->1,or 1->0. (x1<=i<=x2,y1<=j<=y2,z1<=k<=z2).

0: “Query” operation we want to get the value of A[i, j, k].

Input

Multi-cases.

First line contains N and M, M lines follow indicating the operation below.

Each operation contains an X, the type of operation. 1: “Not” operation and 0: “Query” operation.

If X is 1, following x1, y1, z1, x2, y2, z2.

If X is 0, following x, y, z.

Output

For each query output A[x, y, z] in one line. (1<=n<=100 sum of m <=10000)

Sample Input

2 5

1 1 1 1 1 1 1

0 1 1 1

1 1 1 1 2 2 2

0 1 1 1

0 2 2 2

Sample Output

1

0

1

大致题意:

在一个3维空间中,有由1*1*1小正方体组成的边长为n的大正方体。

每个小方块的顶点都有一个值,1或者0.

现在有2种操作。

1.将x1,y1,z1 到 x2,y2,z2.区域内的小方块全取反。

0.查询x,y,z的值是多少。

思路分析:

3维的树状数组。

更新点的时候加1.查询的时候模上2就行了。

一开始不太懂题意,还是DD画了个图给我解释的。

ac代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 110;

int Tree[MAXN][MAXN][MAXN],N,M;

int Lowbit(int i)
{
return i & (-i);
}

void Update(int x,int y,int z)
{
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))
Tree[i][j][k]++;
}

int Query(int x,int y,int z)
{
int sum = 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))
sum += Tree[i][j][k];
return sum;
}

int main()
{
while(cin >> N >> M)
{
memset(Tree,0,sizeof(Tree));
int op,x1,y1,z1,x2,y2,z2;
while(M--)
{
cin >> op;
if(op == 0)
{
cin >> x1 >> y1 >> z1;
cout << Query(x1,y1,z1) % 2 << endl;
}
else
{
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
Update(x1,y1,z1);
Update(x1,y1,z2+1);
Update(x1,y2+1,z1);
Update(x1,y2+1,z2+1);
Update(x2+1,y1,z1);
Update(x2+1,y1,z2+1);
Update(x2+1,y2+1,z1);
Update(x2+1,y2+1,z2+1);
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 数据结构