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;

}

 

你可能感兴趣的:(树状数组)