http://acm.hdu.edu.cn/showproblem.php?pid=3584

来源:互联网 发布:西安行知中学怎么分班 编辑:程序博客网 时间:2024/06/03 12:58
三维树状数组的一个模板题。。应该是属于插线问点这一类型的。。。

题意:一开始三维数组的元素都为0,当输入操作为1时把1->0或者0->1..问经过许多次操作后该位置是1还是0,。

#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>#include<assert.h>#define N 101using namespace std;int s[N][N][N];int lowbit(int x){return x&(-x);}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)) s[i][j][k]++;}int Quary(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+=s[i][j][k];   return sum; }int main(){ int  n,m;   while(~scanf("%d%d",&n,&m))   {   int flag;       int x1,y1,z1,x2,y2,z2;   memset(s,0,sizeof(s));   while(m--)     {    scanf("%d",&flag);       if(flag==0)   {   scanf("%d%d%d",&x1,&y1,&z1);   printf("%d\n",Quary(x1,y1,z1)%2);   }     else {       scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);            update(x1,y1,z1);update(x1,y1,z2+1);update(x1,y2+1,z1);update(x1,y2+1,z2+1);update(x2+1,y1,z1);update(x2+1,y2+1,z1);update(x2+1,y1,z2+1);update(x2+1,y2+1,z2+1);   }      }   }return 0;}


原创粉丝点击