hdu 3584 Cube
3维的树状数组,利用好括号的原理就可以简单解决。由于没有敲过多维树状数组,所以 SB 了一次。具体思路不难,直接代码:
#include <iostream> #include <stdio.h> #include <string.h> #define M 105 using namespace std; int map[M][M][M]; int Lowbit(int n) { return n & (-n); } void Add(int x, int y, int z, int num) { int j, k; while(x < M) { j = y; while(j < M) // 一定要注意这里不能直接 y < M { k = z; while(k < M) // 同理,这里不能直接 z < M { map[x][j][k] += num; k += Lowbit(k); } j += Lowbit(j); } x += Lowbit(x); } } int GetSum(int x, int y, int z) { int sum = 0; int j, k; while(x > 0) { j = y; while(j > 0) // 同上,这里没有查出来,WA了一次 { k = z; while(k > 0) // 反正多维的话,记住这个地方要用暂存变量就是了 { sum += map[x][j][k]; k -= Lowbit(k); } j -= Lowbit(j); } x -= Lowbit(x); } return sum; } int main() { int n, m; while(scanf("%d%d", &n, &m) != EOF) { memset(map, 0, sizeof(map)); int op; while(m --) { scanf("%d", &op); if(op) { int x1, y1, z1; int x2, y2, z2; scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2); // 简单的3维容斥原理,可以随便推一下出来的 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); } else { int x1, y1, z1; scanf("%d%d%d", &x1, &y1, &z1); // 利用树状数组的括号性质,这里直接 GetSum 为答案 int num = GetSum(x1, y1, z1); if(num&1) // 简单地处理奇偶性得到值为 0 或者 1 了 { puts("1"); } else { puts("0"); } } } } return 0; }