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;
}