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<map>
 8 #include<set>
 9 #include<queue> a
10 #include<algorithm>
11 using namespace std;
12
13 typedef long long LL;
14 const int INF = (1<<30)-1;
15 const int mod=1000000007;
16 const int maxn=1000005;
17 const int N=105;
18
19 int n,m;
20 int a[155][155][155],c[155][155][155];
21
22 int lowbit(int x){ return x & (-x);}
23
24 int sum(int x,int y,int z){
25     int ret=0;
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         ret+=c[i][j][k];
30
31         return ret;
32 }
33
34 void add(int x,int y,int z,int d){
35     for(int i=x;i<=N;i+=lowbit(i))
36        for(int j=y;j<=N;j+=lowbit(j))
37         for(int k=z;k<=N;k+=lowbit(k))
38         c[i][j][k] += d;
39 }
40
41
42
43 int main(){
44     while(scanf("%d %d",&n,&m) != EOF){
45         memset(c,0,sizeof(c));
46         while(m--){
47             int cmd;
48             scanf("%d",&cmd);
49             if(cmd == 1){
50                 int x1,y1,z1,x2,y2,z2;
51                 scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2);
52                 x1++;y1++;z1++;
53                 x2++;y2++;z2++;
54                 add(x1,y1,z1,1);
55                 add(x2+1,y1,z1,-1);
56                 add(x1,y2+1,z1,-1);
57                 add(x2+1,y2+1,z1,1);
58
59                 add(x1,y1,z2+1,-1);
60                 add(x2+1,y1,z2+1,1);
61                 add(x1,y2+1,z2+1,1);
62                 add(x2+1,y2+1,z2+1,-1);
63             }
64             else{
65                 int x,y,z;
66                 scanf("%d %d %d",&x,&y,&z);
67                 x++;y++;z++;
68                 printf("%d\n",sum(x,y,z) % 2);
69             }
70         }
71     }
72     return 0;
73 }

时间: 2024-10-11 22:38:19

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

题目链接: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 (三维树状数组)

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 二进制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