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

            }

        }

    }

}

  

你可能感兴趣的:(cube)