hdu3584 树状数组

思路:从一维扩展到三维。可以看看poj2155的解法。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define Maxn 102
#define lowbit(x) (x&(-x))
using namespace std;
int C[Maxn][Maxn][Maxn],n;
int Sum(int i,int j,int k)
{
    int sum=0;
    int y,z;
    y=j,z=k;
    while(i)
    {
        j=y;
        while(j)
        {
            k=z;
            while(k)
            {
                sum+=C[i][j][k];
                k-=lowbit(k);
            }
            j-=lowbit(j);
        }
        i-=lowbit(i);
    }
    return sum;
}
void update(int i,int j,int k)
{
    int y,z;
    y=j,z=k;
    while(i<=n)
    {
        j=y;
        while(j<=n)
        {
            k=z;
            while(k<=n)
            {
                C[i][j][k]++;
                k+=lowbit(k);
            }
            j+=lowbit(j);
        }
        i+=lowbit(i);
    }
}
int main()
{
    int x1,x2,y1,y2,z1,z2,m,x;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(C,0,sizeof(C));
        while(m--)
        {
            scanf("%d",&x);
            if(x==0)
            {
                scanf("%d%d%d",&x1,&y1,&z1);
                printf("%d\n",Sum(x1,y1,z1)&1);
            }
            if(x==1)
            {
                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
                update(x1,y1,z1);
                update(x1,y2+1,z1);
                update(x2+1,y2+1,z1);
                update(x2+1,y1,z1);
                update(x1,y1,z2+1);
                update(x1,y2+1,z2+1);
                update(x2+1,y2+1,z2+1);
                update(x2+1,y1,z2+1);
            }
        }
    }
    return 0;
}

 

posted @ 2013-07-31 21:17  fangguo  阅读(127)  评论(0编辑  收藏  举报