hdu 3584 Cube (三维树状数组)

Cube

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 1307    Accepted Submission(s): 674


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
 
Author
alpc32
 
Source
 
Recommend
zhouzeyong   |   We have carefully selected several similar problems for you:  3450 1541 1892 2492 3743 
 
 1 //203MS    4784K    1280 B    G++
 2 /*
 3 
 4     题意和原理都和poj 的2155 差不多,这题多了一维而已。 
 5 
 6 */
 7 #include<stdio.h>
 8 #include<string.h>
 9 #define N 105
10 int c[N][N][N];
11 int lowbit(int i)
12 {
13     return i&(-i);
14 }
15 int update(int x,int y,int z)
16 {
17     int s=0;
18     for(int i=x;i<N;i+=lowbit(i))
19         for(int j=y;j<N;j+=lowbit(j))
20             for(int k=z;k<N;k+=lowbit(k))
21                 s+=c[i][j][k];
22     return s%2;
23 }
24 void getsum(int x,int y,int z)
25 {
26     for(int i=x;i>0;i-=lowbit(i))
27         for(int j=y;j>0;j-=lowbit(j))
28             for(int k=z;k>0;k-=lowbit(k))
29                 c[i][j][k]^=1;
30 }
31 int main(void)
32 {
33     int n,m;
34     int op,x1,x2,y1,y2,z1,z2;
35     while(scanf("%d%d",&n,&m)!=EOF)
36     {
37         memset(c,0,sizeof(c));
38         while(m--){
39             scanf("%d",&op);
40             if(op==0){
41                 scanf("%d%d%d",&x1,&y1,&z1);
42                 printf("%d
",update(x1,y1,z1));
43             }else if(op==1){
44                 scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
45                 getsum(x1-1,y1-1,z1-1);
46                 getsum(x1-1,y1-1,z2);
47                 getsum(x1-1,y2,z1-1);
48                 getsum(x2,y1-1,z1-1);
49                 getsum(x2,y1-1,z2);
50                 getsum(x1-1,y2,z2);
51                 getsum(x2,y2,z1-1);
52                 getsum(x2,y2,z2);
53             }
54         }
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/GO-NO-1/p/3639300.html