HDU 3584 Cube (三维树状数组)

题目链接: 戳我

题目大意:

 

思路: 看这篇论文  

算法合集之《浅谈信息学竞赛中的“0”和“1”》

代码:

//Author LJH
//www.cnblogs.com/tenlee
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#define clc(a, b) memset(a, b, sizeof(a))
using namespace std;

const int inf = 0x3f;
const int INF = 0x3f3f3f3f;
const int maxn = 105;

int a[maxn][maxn][maxn], n;

int lowbit(int x)
{
    return x & -x;
}

void Add(int x, int y, int z, int val)
{
    int yy = y, zz = z;
    while(x <= maxn)
    {
        yy = y;
        while(yy <= maxn)
        {
            zz = z;
            while(zz <= maxn)
            {
                a[x][yy][zz] += val;
                zz += lowbit(zz);
            }
            yy += lowbit(yy);
        }
        x += lowbit(x);
    }
}

int Sum(int x, int y, int z)
{
    int yy = y, zz = z, ans = 0;
    while(x)
    {
        yy = y;
        while(yy)
        {
            zz = z;
            while(zz)
            {
                ans += a[x][yy][zz];
                zz -= lowbit(zz);
            }
            yy -= lowbit(yy);
        }
        x -= lowbit(x);
    }
    return ans;
}

int main()
{
    int m, op, x1, y1, z1, x2, y2, z2;
    while(~scanf("%d %d", &n, &m))
    {
        memset(a, 0, sizeof(a));
        while(m--)
        {
            scanf("%d", &op);
            if(op == 1)
            {
                scanf("%d %d %d %d %d %d", &x1, &y1, &z1, &x2, &y2, &z2);
                x1++ , y1++ , z1++;  
                x2++ , y2++ , z2++;  
                // up  
                Add(x1 , y1 , z1 , 1);   
                Add(x1 , y2+1 , z1 , -1);   
                Add(x2+1 , y1 , z1 , -1);   
                Add(x2+1 , y2+1 , z1 , 1);   
                // down  
                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 , z2+1 , -1); 
            }
            else 
            {
                scanf("%d %d %d", &x1, &y1, &z1);
                x1++; y1++; z1++;
                printf("%d\n", Sum(x1, y1, z1) % 2);
            }
        }
    }
}

  

posted @ 2015-06-05 21:57  豪气干云  阅读(193)  评论(0编辑  收藏  举报