hdu 3584 Cube(三维树状数组)

96 篇文章 0 订阅
64 篇文章 0 订阅

题意

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值