題意:有一個立方體,初始每個格子都為0,可以對格子操作,把0變為1,把1變為0,最後詢問某個格子最後的值 是多少。
思路:三維樹狀數組的應用,插線問點。
代碼:
[cpp]
#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);
} www.2cto.com
else{
scanf("%d%d%d",&x1,&y1,&z1);
if(sum(x1,y1,z1) % 2)
printf("1\n");
else
printf("0\n");
}
}
}
return 0;
}