HDU 3584 Cube

 

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

裸三维树状数组。。。除了三维的容斥要稍微想一下别的都和一维、二维的一样了

View Code
#include <iostream>

using namespace std;

const int MAX=101;

int n;

int tree[MAX][MAX][MAX];

int lowbit(int i){

    return i&(-i);

}

void update(int x,int y,int z)

{

    for(int i=x;i<=n;i+=lowbit(i))

        for(int j=y;j<=n;j+=lowbit(j))

            for(int k=z;k<=n;k+=lowbit(k))

                tree[i][j][k]^=1;

}

int Sum(int x,int y,int z)

{

    int sum=0;

    for(int i=x;i>0;i-=lowbit(i))

        for(int j=y;j>0;j-=lowbit(j))

            for(int k=z;k>0;k-=lowbit(k))

                sum+=tree[i][j][k];

    return sum;

}

int main()

{

    int m;

    while(~scanf("%d%d",&n,&m))

    {

        memset(tree,0,sizeof(tree));

        while(m--)

        {

            int op;

            scanf("%d",&op);

            int x1,y1,z1,x2,y2,z2;

            if(op)

            {

                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);

                update(x1,y1,z1);

                update(x2+1,y2+1,z2+1);

                update(x1,y1,z2+1);

                update(x2+1,y1,z1);

                update(x1,y2+1,z1);

                update(x1,y2+1,z2+1);

                update(x2+1,y1,z2+1);  

                update(x2+1,y2+1,z1);

            }

            else

            {

                scanf("%d%d%d",&x1,&y1,&z1);

                printf("%d\n",Sum(x1,y1,z1)&1);

            }

        }

    }

    return 0;

} 

 

你可能感兴趣的:(cube)