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代码:
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; }
相关文章推荐
- HDU 3584 Cube (三维树状数组)
- hdu 3584 Cube(三维树状数组)
- HDU 3584 Cube(三维树状数组)
- HDU 3584 Cube (三维树状数组)
- HDU 3584 Cube (三维树状数组)
- HDU 3584 Cube(三维树状数组)
- 【树状数组(三维)】hdu 3584 Cube
- hdu 1541 Stars poj 1195 Mobile phones(二维) poj 2155 Matrix(二维) hdu 3584 Cube(三维) 树状数组
- HDU 3584 Cube (三维树状数组)
- HDU - 3584 Cube(三维树状数组)
- poj 2155 Matrix(二维树状数组) hdu 3584 Cube(三维)
- hdu 3584 Cube (三维树状数组)
- HDU 3584 Cube(三维树状数组)
- POJ-2155 Matrix 二维树状数组, HDU-3584 Cube 三维树状数组
- HDU 3584 Cube(三维树状数组)
- 【树状数组+三维】杭电 hdu 3584 Cube
- HDU 3584 Cube --三维树状数组
- hdu 3584 (三维树状数组模板 )
- hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板
- hdoj--3584 Cube(三维树状数组)