HDU 3584 Cube(三维树状数组)

来源:互联网 发布:手机淘宝怎样撤销投诉 编辑:程序博客网 时间:2024/04/30 22:25

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584

题意:三维的空间中有两个操作,初始时每个空间元素均为0,更新操作是0变1,1变0,是一个空间内的所有元素都更新,查询是问这个点的元素是0还是1。

题解:三维树状数组的IUPQ模型(Interval Update Point Query段更新,点求值)。

关键在更新的时候的边界处理,好像是容斥原理,并不懂,先记住吧。

二维的情况:

add(x1, y1, v);add(x1,y2+1, -v);add(x2+1,y1,-v);add(x2+1,y2+1,v);

三维的情况:

Add(x1,y1,z1,1);Add(x1,y1,z2+1,-1);Add(x1,y2+1,z1,-1);Add(x2+1,y1,z1,-1);Add(x2+1,y2+1,z1,1);Add(x2+1,y1,z2+1,1);Add(x1,y2+1,z2+1,1);<p>Add(x2+1,y2+1,z2+1,-1);</p>

这道题因为只需转变0和1,所以一直加1,求mod2就行.

代码:

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int MAX=100+5;typedef long long LL;int bit[MAX][MAX][MAX];int N;int sum(int x,int y,int z){    int s=0;    for(int i=x; i>0; i-=(i&(-i)))        for(int j=y; j>0; j-=(j&(-j)))            for(int k=z; k>0; k-=(k&(-k)))                s+=bit[i][j][k];    return s;}void add(int x,int y,int z){    for(int i=x; i<=N; i+=(i&(-i)))        for(int j=y; j<=N; j+=(j&(-j)))            for(int k=z; k<=N; k+=(k&(-k)))                bit[i][j][k]++;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)==2)    {        N=n;        memset(bit,0,sizeof(bit));        for(int i=0; i<m; i++)        {            int op;            scanf("%d",&op);            if(op==1)            {                int x1,y1,z1,x2,y2,z2;                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);                add(x1,y1,z1);                add(x1,y1,z2+1);                add(x1,y2+1,z1);                add(x1,y2+1,z2+1);                add(x2+1,y1,z1);                add(x2+1,y1,z2+1);                add(x2+1,y2+1,z1);                add(x2+1,y2+1,z2+1);            }            else if(op==0)            {                int x,y,z;                scanf("%d%d%d",&x,&y,&z);                printf("%d\n",sum(x,y,z)%2);            }        }    }    return 0;}

关键在更新的时候的边界处理,好像是容斥原理,并不懂,先记住吧。
0 0
原创粉丝点击