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; }