hdu 3584 Cube

3维的树状数组,利用好括号的原理就可以简单解决。由于没有敲过多维树状数组,所以 SB 了一次。具体思路不难,直接代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#define M 105

using namespace std;

int map[M][M][M];

int Lowbit(int n)
{
    return n & (-n);
}

void Add(int x, int y, int z, int num)
{
    int j, k;
    while(x < M)
    {
        j = y;
        while(j < M) // 一定要注意这里不能直接 y < M
        {
            k = z;
            while(k < M)  // 同理,这里不能直接 z < M
            {
                map[x][j][k] += num;
                k += Lowbit(k);
            }
            j += Lowbit(j);
        }
        x += Lowbit(x);
    }
}

int GetSum(int x, int y, int z)
{
    int sum = 0;
    int j, k;
    while(x > 0)
    {
        j = y;
        while(j > 0) // 同上,这里没有查出来,WA了一次
        {
            k = z;
            while(k > 0) // 反正多维的话,记住这个地方要用暂存变量就是了
            {
                sum += map[x][j][k];
                k -= Lowbit(k);
            }
            j -= Lowbit(j);
        }
        x -= Lowbit(x);
    }
    return sum;
}

int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF)
    {
        memset(map, 0, sizeof(map));
        int op;
        while(m --)
        {
            scanf("%d", &op);
            if(op)
            {
                int x1, y1, z1;
                int x2, y2, z2;
                scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2);
                // 简单的3维容斥原理,可以随便推一下出来的
                Add(x1, y1, z1, 1);
                Add(x2+1, y1, z1, -1);
                Add(x1, y2+1, z1, -1);
                Add(x1, y1, z2+1, -1);
                Add(x1, y2+1, z2+1, 1);
                Add(x2+1, y1, z2+1, 1);
                Add(x2+1, y2+1, z1, 1);
                Add(x2+1, y2+1, z2+1, -1);
            }
            else
            {
                int x1, y1, z1;
                scanf("%d%d%d", &x1, &y1, &z1);
                // 利用树状数组的括号性质,这里直接 GetSum 为答案
                int num = GetSum(x1, y1, z1);
                if(num&1) // 简单地处理奇偶性得到值为 0 或者 1 了
                {
                    puts("1");
                }
                else
                {
                    puts("0");
                }
            }
        }
    }
    return 0;
}

地址:http://acm.hdu.edu.cn/showproblem.php?pid=3584

posted @ 2010-09-06 02:43  LiJunLe  阅读(521)  评论(0编辑  收藏  举报