HDU3584 Cube

来源:互联网 发布:手机免费炒股软件 编辑:程序博客网 时间:2024/06/11 21:16

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3584

三维树状数组。

由题意可知,进行偶数次操作后的结果是0,进行奇数次为1。

这样用树状数组记录操作次数,最后判断奇偶就行了。

在更新每一个立方体的时候,要注意处理那些立方体之外多加的那些。操作详见代码。

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <cstdlib>#include <algorithm>#include <map>using namespace std;int tree[105][105][105];int n,m;int lb(int x){return x&-x;}void add(int num,int x,int y,int z){for(int i=x;i<=n;i+=lb(i)){for(int j=y;j<=n;j+=lb(j)){for(int k=z;k<=n;k+=lb(k)){tree[i][j][k]+=num;}}}}int read(int x,int y,int z){int tot=0;for(int i=x;i;i-=lb(i)){for(int j=y;j;j-=lb(j)){for(int k=z;k;k-=lb(k)){tot+=tree[i][j][k];}}}return tot;}int main(){while(scanf("%d%d",&n,&m)!=EOF){memset(tree,0,sizeof(tree));for(int i=1;i<=m;i++){int c;scanf("%d",&c);if(c){int x1,y1,z1,x2,y2,z2;scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);add(1,x1,y1,z1);add(1,x1,y1,z2+1);add(1,x1,y2+1,z1);add(1,x2+1,y1,z1);add(1,x1,y2+1,z2+1);add(1,x2+1,y1,z2+1);add(1,x2+1,y2+1,z1);add(1,x2+1,y2+1,z2+1);}else{int x1,y1,z1;scanf("%d%d%d",&x1,&y1,&z1);int t=read(x1,y1,z1);if(t&1)printf("1\n");else printf("0\n");}}}return 0;}


原创粉丝点击