由二维的推一下就好了
注意一下三维空间的容斥性,更新的时候
注意一下这是区间更新,单点查询
仔细想一想为什么可以这么做
Add(x1, y1, z1, 1); Add(x2+1, y1, z1, -1); Add(x1, y2+1, z1, -1); Add(x1, y1, z2+1, -1); Add(x1, y2+1, z2+1, 1); Add(x2+1, y1, z2+1, 1); Add(x2+1, y2+1, z1, 1); Add(x2+1, y2+1, z2+1, -1);
#include <cstdio> #include <cstring> const int MAXN = 100 + 3; int tree[MAXN][MAXN][MAXN]; int n; inline int lowbit(int x) { return x & (-x); } void update(int x, int y, int z, int c) { 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)) { tree[i][j][k] += c; } } } } int getsum(int x, int y, int z) { int sum = 0; for(int i = x; i >= 1; i -= lowbit(i)) { for(int j = y; j >= 1; j -= lowbit(j)) { for(int k = z; k >= 1; k -= lowbit(k)) { sum += tree[i][j][k]; } } } return sum; } int main() { int m; while(scanf("%d%d", &n, &m) != EOF) { memset(tree, 0, sizeof(tree)); int x1, y1, z1, x2, y2, z2, q; while(m--) { scanf("%d", &q); if(q) { scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2); update(x1, y1, z1, 1);//更新这个点到n的矩阵 update(x2 + 1, y1, z1, 1); update(x1, y2 + 1, z1, 1); update(x1, y1, z2 + 1, 1); update(x2 + 1, y2 + 1, z1, 1); update(x2 + 1, y1, z2 + 1, 1); update(x1, y2 + 1, z2 + 1, 1); update(x2 + 1, y2 + 1, z2 + 1, 1); } else { scanf("%d%d%d", &x1, &y1, &z1); int t = getsum(x1, y1, z1); if(t & 1) puts("1"); else puts("0"); } } } return 0; }