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, 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

 1 /*AC代码*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5
 6 using namespace std;
 7
 8 const int N=110;
 9
10 int n,m,arr[N][N][N];
11
12 int lowbit(int x)
13 {
14     return x&(-x);
15 }
16
17 void update(int i,int j,int k,int val)
18 {
19     while(i<=n)
20     {
21         int tmpj=j;
22         while(tmpj<=n)
23         {
24             int tmpk=k;
25             while(tmpk<=n)
26             {
27                 arr[i][tmpj][tmpk]+=val;
28                 tmpk+=lowbit(tmpk);
29             }
30             tmpj+=lowbit(tmpj);
31         }
32         i+=lowbit(i);
33     }
34 }
35
36 int Sum(int i,int j,int k)
37 {
38     int ans=0;
39     while(i>0)
40     {
41         int tmpj=j;
42         while(tmpj>0)
43         {
44             int tmpk=k;
45             while(tmpk>0)
46             {
47                 ans+=arr[i][tmpj][tmpk];
48                 tmpk-=lowbit(tmpk);
49             }
50             tmpj-=lowbit(tmpj);
51         }
52         i-=lowbit(i);
53     }
54     return ans;
55 }
56
57 int main()
58 {
59
60     //freopen("input.txt","r",stdin);
61
62     while(~scanf("%d%d",&n,&m))
63     {
64         memset(arr,0,sizeof(arr));
65         int x1,y1,z1,x2,y2,z2;
66         int op;
67         while(m--)
68         {
69             scanf("%d",&op);
70             if(op==1)
71             {
72                 scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
73                 update(x2+1, y2+1, z2+1, 1);
74                 update(x1, y2+1, z2+1, 1);
75                 update(x2+1, y1, z2+1, 1);
76                 update(x2+1, y2+1, z1, 1);
77                 update(x1, y1, z2+1, 1);
78                 update(x2+1, y1, z1, 1);
79                 update(x1, y2+1, z1, 1);
80                 update(x1, y1, z1, 1);
81             }
82             else
83              {
84                 scanf("%d%d%d",&x1,&y1,&z1);
85                 printf("%d\n",Sum(x1,y1,z1)&1);
86   //该点的值就是sum(x,y)
87             }
88         }
89     }
90     return 0;
91 }

感觉三维应该和二维差不多   变一下下就好了

但是我就是wa了  囧 照例,下面的代码 请无视

 1 /*wa代码*/
 2 #include<iostream>
 3
 4 using namespace std;
 5
 6 int N;
 7 int c[105][105][105];
 8
 9 int lowbit( int x )
10 {
11     return x & (-x);
12 }
13
14 void update( int x, int y, int z, int delta )
15 {
16     int i, j , k;
17     for(i=x; i<=N; i+=lowbit(i))
18     {
19         for(j=y; j<=N; j+=lowbit(j))
20         {
21             for(k=z ; k<=N; k+=lowbit(j))
22                 c[i][j][k] += delta;
23         }
24     }
25 }
26
27 int sum( int x, int y , int z )
28 {
29     int res = 0, i, j , k;
30     for(i=x; i>0; i-=lowbit(i))
31     {
32         for(j=y; j>0; j-=lowbit(j))
33         {
34             for(k=z; k>0; k-=lowbit(j))
35                 {
36                     res += c[i][j][k];
37                 }
38         }
39     }
40     return res;
41 }
42
43
44 void init ()
45 {
46     int i,j,k;
47     for(i=0;i<=N;i++)
48         for(j=0;j<=N;j++)
49             for(k=0;k<=N;k++)
50                 c[i][j][k]=0;
51 }
52
53 int main()
54 {
55     int x1,y1,z1,x2,y2,z2;
56     int temp,p;
57
58     while(scanf("%d%d%",&N,&p)!=EOF)
59     {
60         init ();
61         while(p--)
62         {
63             scanf("%d",&temp);
64             if(temp==1)
65             {
66             //    printf("input x1~z2\n");
67
68                 scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
69                 update(x2+1, y2+1, z2+1, 1);
70                 update(x1, y2+1, z2+1, 1);
71                 update(x2+1, y1, z2+1, 1);
72                 update(x2+1, y2+1, z1, 1);
73                 update(x1, y1, z2+1, 1);
74                 update(x2+1, y1, z1, 1);
75                 update(x1, y2+1, z1, 1);
76                 update(x1, y1, z1, 1);
77
78             }
79             else if(temp==0)
80             {
81                 scanf("%d%d%d",&x1,&y1,&z1);
82                 printf("%d\n",sum(x1,y1,z1)&1);
83             }
84         }
85 }
86
87     return 0 ;
88 }

HDU 3584 Cube (三维 树状数组),布布扣,bubuko.com

时间: 2024-08-02 18:58:46

HDU 3584 Cube (三维 树状数组)的相关文章

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 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

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

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(三维树状数组)

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 【 三维树状数组 】

题意:还是那篇论文里面讲到的,三维树状数组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

HDU3584 Cube【树状数组】【三维】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3584 题目大意: 给定一个N*N*N多维数据集A,其元素是0或是1.A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值. 首先由A[i,j,k] = 0(1 <= i,j,k <= N). 给定两个操作: 1:改变A[i,j,k]为!A[i,j,k]. 2:查询A[i,j,k]的值. 思路: 三维树状数组区间更新.单点查询.更新区间(a,b)时,在 a 和 b+1 处都加1,前边表

HDU 1541 Stars (树状数组)

Problem Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given