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

2010 ACM-ICPC Multi-University
Training Contest(15)——Host by NUDT

Recommend

zhouzeyong   |   We have carefully selected several similar problems for you:  3450 1541 1892 2492 3743

题意:N*N*N的立方体,元素为0或1(初始为0)。1操作将(x1,y1,z1)到(x2,y2,z2)之间的元素取反;0操作是询问(x,y,z)为0或1。

题解:三维树状数组,原理跟一维,二维一样,可以参考http://blog.csdn.net/acm_baihuzi/article/details/46819049

#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define N 110

using namespace std;

int n,q;
int bit[N][N][N];
int getsum(int a,int b,int c) {
    int sum=0;
    for(int i=a; i>0; i-=i&-i) {
        for(int j=b; j>0; j-=j&-j) {
            for(int k=c; k>0; k-=k&-k) {
                sum+=bit[i][j][k];
            }
        }
    }
    return sum;
}

void add(int a,int b,int c) {
    for(int i=a; i<=n; i+=i&-i) {
        for(int j=b; j<=n; j+=j&-j) {
            for(int k=c; k<=n; k+=k&-k) {
                bit[i][j][k]^=1;
            }
        }
    }
}

int main() {
    //freopen("test.in","r",stdin);
    while(cin>>n>>q) {
        memset(bit,0,sizeof bit);
        int op,x2,y2,z2,x1,y1,z1;
        while(q--) {
            scanf("%d%d%d%d",&op,&x1,&y1,&z1);
            if(op==0) {
                printf("%d\n",getsum(x1,y1,z1)%2);
                continue;
            }
            scanf("%d%d%d",&x2,&y2,&z2);
            add(x1,y1,z1);
            add(x1,y1,z2+1);
            add(x1,y2+1,z1);
            add(x1,y2+1,z2+1);
            add(x2+1,y1,z1);
            add(x2+1,y1,z2+1);
            add(x2+1,y2+1,z1);
            add(x2+1,y2+1,z2+1);
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 20:24:15

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

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