题意
n*n*n空间内,对一个以(x1, y1, z1), (x2, y2, z2)连成的线为体对角线的长方体的值取反,查询(x,y,z)的值。初始值为0
解题思路:
用三维树状数组区间更新单点查询。
三维的树状数组容斥起来麻烦一点。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m;
int bit[105][105][105];
int lowbit(int x)
{
return x&-x;
}
int query(int x, int y, int z)
{
int res=0, i, j, k;
for(i=x; i<=n; i+=lowbit(i))
{
for(j=y; j<=n; j+=lowbit(j))
{
for(k=z; k<=n; k+=lowbit(k))
{
res+=bit[i][j][k];
// res=(res%2+2)%2;
}
}
}
return res;
}
void add(int x, int y, int z, int e)
{
int i, j, k;
for(i=x; i>0; i-=lowbit(i))
{
for(j=y; j>0; j-=lowbit(j))
{
for(k=z; k>0; k-=lowbit(k))
{
bit[i][j][k]=((bit[i][j][k]+e));
}
}
}
return;
}
int main()
{
int i, j;
int x, y, z, a, b, c;
while(~scanf("%d%d", &n, &m))
{
int e, i, j, k;
memset(bit, 0, sizeof bit);
while(m--)
{
scanf("%d", &e);
if(e==1)
{
scanf("%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c);
add(a, b, c,1),add(a,b,z-1,-1),add(a,y-1,c, -1),add(x-1,b,c,-1),add(x-1,y-1,c, 1),add(x-1,b,z-1, 1),add(a,y-1,z-1,1),add(x-1, y-1, z-1,-1);
}
else
{
scanf("%d%d%d", &x, &y, &z);
// if(query(x,y,z)%2==0)printf("0\n");
// else printf("1\n");
printf("%d\n", (query(x, y, z))%2);
}
}
}
}