HDU 3584 Cube

Cube

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

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 1394 1892 2492 
 
思路:三维树状数组,向后更新,向前求和
 
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
int map[110][110][110];
int n,m;
int sum;
int operation;
int x_1,y_1,z_1,x_2,y_2,z_2;
int posix,posiy,posiz;
int lowbit(int x)
{
    return x & (- x);
}
void update(int i, int j, int k, int x)
{
    int tj, tk;
    while(i <= n)
    {
        tj = j;
        while(tj <= n)
        {
            tk = k;
            while(tk <= n)
            {
                map[i][tj][tk] += x;
                tk += lowbit(tk);
            }
            tj += lowbit(tj);
        }
        i += lowbit(i);
    }
}
int Sum(int i,int j,int k){
    int ans = 0;
    while(i > 0)
    {
        int tempj = j;
        while(tempj > 0)
        {
            int tempk = k;
            while(tempk > 0)
            {
                ans += map[i][tempj][tempk];
                tempk -= lowbit(tempk);
            }
            tempj -= lowbit(tempj);
        }
        i -= lowbit(i);
    }
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(map,0,sizeof(map));
        while(m --)
        {
            scanf("%d",&operation);
            if(operation == 1)
            {
                scanf("%d%d%d%d%d%d",&x_1,&y_1,&z_1,&x_2,&y_2,&z_2);
                update(x_2 + 1,y_2 + 1,z_2 + 1,1);
                update(x_2 + 1,y_2 + 1,z_1,1);
                update(x_2 + 1,y_1,z_2 + 1,1);
                update(x_1,y_2 + 1,z_2 + 1,1);
                update(x_2 + 1,y_1,z_1,1);
                update(x_1,y_2 + 1,z_1,1);
                update(x_1,y_1,z_2 + 1,1);
                update(x_1,y_1,z_1,1);
            }
            else
            {
                scanf("%d%d%d",&posix,&posiy,&posiz);
                sum = Sum(posix,posiy,posiz);
                printf("%d\n",sum & 1);
            }
        }
    }
    return 0;
}

 

posted on 2013-10-29 11:06  天使是一个善良的神  阅读(155)  评论(0编辑  收藏  举报

导航