HDU_3584_Cube

这题为啥用树状数组呢?

首先1<=N<=100,如果暴力修改的话,最糟糕的时间为O(N*N*N),然后有M个命令,1<=M<=10000,总耗时为O(M*N*N*N),也就是100*100*100*10000,而限时1s,神仙难救~

如果把修改次数看成前缀和,修改次数为奇数,答案则为1,修改次数为偶数,则为0,总的耗时为Q(M*logN*logN*logN),随意可过~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
#define N 105
int c[N][N][N],n,m;
int sum(int x,int y,int z)
{
    int ret=0,i,j,k;
    for(i=x;i;i-=(i&-i))
        for(j=y;j;j-=(j&-j))
            for(k=z;k;k-=(k&-k))
                ret+=c[i][j][k];
    return ret;
}
void add(int x,int y,int z,int d)
{
    int i,j,k;
    for(i=x;i<=n;i+=(i&-i))
        for(j=y;j<=n;j+=(j&-j))
            for(k=z;k<=n;k+=(k&-k))
                c[i][j][k]+=d;
}
int main()
{
    int q,x1,y1,z1,x2,y2,z2;
    while(~scanf("%d%d",&n,&m))
    {
        memset(c,0,sizeof(c));
        while(m--)
        {

            scanf("%d",&q);
            if(q==1)
            {
                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
                /*一言难尽啊~,自己找个长方体模拟一下吧*/
                add(x2+1,y2+1,z2+1,1);
                add(x1,y2+1,z2+1,1);
                add(x2+1,y1,z2+1,1);
                add(x1,y1,z2+1,1);

                add(x1,y2+1,z1,1);
                add(x2+1,y1,z1,1);
                add(x2+1,y2+1,z1,1);
                add(x1,y1,z1,1);
            }
            else
            {
                scanf("%d%d%d",&x1,&y1,&z1);
                printf("%d\n",sum(x1,y1,z1)&1);
            }
        }
    }
 return 0;
}

 

 

posted @ 2013-05-22 21:29  小仪在努力~  阅读(392)  评论(0编辑  收藏  举报