概述
来源:http://acm.hdu.edu.cn/showproblem.php?pid=3584
题意:有一个立方体,初始每个格子都为0,可以对格子操作,把0变为1,把1变为0,最后询问某个格子最后的值 是多少。
思路:三维树状数组的应用,插线问点。
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int N = 110;
int num[N][N][N];
int inline lowbit(int x){
return x & (-x);
}
void inline update(int x,int y,int z,int add){
int tempy = y,tempz = z;
while(x > 0){
y = tempy;
while(y > 0){
z = tempz;
while(z > 0){
num[x][y][z] += add;
z -= lowbit(z);
}
y -= lowbit(y);
}
x -= lowbit(x);
}
}
int inline sum(int x,int y,int z){
int tempy = y,tempz = z, s = 0;
while(x < N){
y = tempy;
while(y < N){
z = tempz;
while(z < N){
s += num[x][y][z];
z += lowbit(z);
}
y += lowbit(y);
}
x += lowbit(x);
}
return s;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m) != EOF){
int x1,y1,z1,x2,y2,z2;
memset(num,0,sizeof(num));
int id;
while(m--){
scanf("%d",&id);
if(id == 1){
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
update(x2,y2,z2,1);
update(x1-1,y2,z2,-1);
update(x2,y1-1,z2,-1);
update(x2,y2,z1-1,-1);
update(x1-1,y1-1,z2,1);
update(x1-1,y2,z1-1,1);
update(x2,y1-1,z1-1,1);
update(x1-1,y1-1,z1-1,-1);
}
else{
scanf("%d%d%d",&x1,&y1,&z1);
if(sum(x1,y1,z1) % 2)
printf("1n");
else
printf("0n");
}
}
}
return 0;
}
最后
以上就是健壮钢笔为你收集整理的HDU 3584 Cube 三维树状数组的全部内容,希望文章能够帮你解决HDU 3584 Cube 三维树状数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复