您的位置:首页 > 其它

HDU 3584 三维树状数组

2013-09-03 21:23 176 查看
给一个n和一个m,n*n*n 的空间里,进行m次操作,一共有两种操作

_0 查询 x y z 点的状态.

_1 x1 y1 z1 x2 y2 z2 两点确定一个长方体,长方体内所有元素取反

区间更新,点查询。

get()得到点状态,add ()更新右上方,但是操作有8次.(2维4次)

三维的和二维的差不多...

#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
int cc[105][105][105];
int mx=101;
int lowbit(int x){
return -x&x;
}
void add(int x,int y,int z,int v){
int rt=y,rt2=z;
while(x<=mx){
y=rt;
while(y<=mx){
z=rt2;
while(z<=mx){
cc[x][y][z]+=v,z+=lowbit(z);
}
y+=lowbit(y);
}
x+=lowbit(x);
}
}
int get(int x,int y,int z){
int sum=0,rt=y,rt2=z;
while(x>0){
y=rt;
while(y>0){
z=rt2;
while(z>0){
sum+=cc[x][y][z];
z-=lowbit(z);
}
y-=lowbit(y);
}
x-=lowbit(x);
}return sum;
}
int main(){
int x,y,z,a,b,c,m,q;
while(scanf("%d %d",&mx,&m)!=EOF){
memset(cc,0,sizeof(cc));
while(m--){
scanf("%d",&q);
if(1==q){
scanf("%d %d %d %d %d %d",&x,&y,&z,&a,&b,&c);
int xx=min(x,a),xxx=x+a-xx;
int yy=min(y,b),yyy=y+b-yy;
int zz=min(z,c),zzz=z+c-zz;

add(xx,yy,zz,1);
add(xxx+1,yyy+1,zzz+1,1);

add(xxx+1,yyy+1,zz,1);
add(xxx+1,yy,zzz+1,1);
add(xx,yyy+1,zzz+1,1);

add(xxx+1,yy,zz,-1);
add(xx,yyy+1,zz,-1);
add(xx,yy,zzz+1,-1);
}
else {
scanf("%d %d %d",&x,&y,&z);
printf("%d\n",(get(x,y,z)&1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: