hdu 3584 Cube

来源:互联网 发布:java微服务框架有哪些 编辑:程序博客网 时间:2024/05/17 00:54

三维树状数组,思维转化很有意思,好像是什么容斥原理。
主要原因是纯暴力肯定会超时,所以要优化,将某一点的和与该点状态想关联,用这样的方法来求解问题。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int N=100+24;int p[N][N][N],n;int lowbit(int x){    return x&-x;}int sum(int x,int y,int z){    int i,j,k,ret=0;    for(i=x;i>0;i-=lowbit(i))        for(j=y;j>0;j-=lowbit(j))            for(k=z;k>0;k-=lowbit(k))                ret+=p[i][j][k];    return ret%2;}void add(int x,int y,int z){    int i,j,k;    for(i=x;i<105;i+=lowbit(i))        for(j=y;j<105;j+=lowbit(j))            for(k=z;k<105;k+=lowbit(k))                p[i][j][k]+=1;}int main(){    int m,i,j,k,a1,a2,b1,b2,c1,c2,t;    while(~scanf("%d%d",&n,&m))    {        memset(p,0,sizeof(p));        while(m--)        {            scanf("%d",&t);            if(t==0)            {                scanf("%d%d%d",&a1,&b1,&c1);                printf("%d\n",sum(a1,b1,c1));            }            else            {                scanf("%d%d%d",&a1,&b1,&c1);                scanf("%d%d%d",&a2,&b2,&c2);                //可以画图来理解一下                add(a1,b1,c1);                add(a1,b1,c2+1);                add(a1,b2+1,c1);                add(a1,b2+1,c2+1);                add(a2+1,b2+1,c2+1);                add(a2+1,b1,c2+1);                add(a2+1,b2+1,c1);                add(a2+1,b1,c1);            }        }    }    return 0;}
0 0