概述
三维树状数组的一个模板题。。应该是属于插线问点这一类型的。。。
题意:一开始三维数组的元素都为0,当输入操作为1时把1->0或者0->1..问经过许多次操作后该位置是1还是0,。
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #include<assert.h> #define N 101 using 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("%dn",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; }
最后
以上就是斯文心情为你收集整理的http://acm.hdu.edu.cn/showproblem.php?pid=3584的全部内容,希望文章能够帮你解决http://acm.hdu.edu.cn/showproblem.php?pid=3584所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复