hdu 3584 Cube(树状数组)

简介:

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

分析:题意很简单,就是一个在三维上变化的,输入区间时把这个区间的上的1变为0,0变为1,输入查询时,求出即可。

刚开始想到是线段树,可是三维无从下手,网上查了一些答案,使用的都是树状数组,更新时要注意容斥原理,每个维度的组合2^3=8.

求取结果使用的是 sum(x1,y1,z1)&1 或是 sum(x1,y1,z1)%2,这点还不是很清楚。。。有待在理解理解╮(╯▽╰)╭

复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 105
using namespace std;

int cube[MAXN][MAXN][MAXN];
int N,M;

int low_bit(int x)
{
    return x & (-x);
}
//更新三维树状数组
void update(int x,int y,int z)
{
    for(int i = x; i <= N; i += low_bit(i))
    for(int j = y; j <= N; j += low_bit(j))
    for(int k = z; k <= N; k += low_bit(k))
    cube[i][j][k]++;
}

int sum(int x,int y,int z)
{
    int ans=0;
    for(int i = x; i > 0; i -= low_bit(i))
    for(int j = y; j > 0; j -= low_bit(j))
    for(int k = z; k > 0; k -= low_bit(k))
    ans += cube[i][j][k];
    return ans;
}

int main()
{
    int oper;
    int x1,y1,z1,x2,y2,z2;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        memset(cube,0,sizeof(cube));
        for(int i = 0; i < M; i++)
        {
            scanf("%d",&oper);
            if(oper==1)
            {
                scanf("%d%d%d %d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
                //三维树状数组更新,容斥原理
                update(x1,y1,z1);
                update(x1,y1,z2+1);
                update(x1,y2+1,z1);
                update(x1,y2+1,z2+1);
                update(x2+1,y1,z1);
                update(x2+1,y1,z2+1);
                update(x2+1,y2+1,z1);
                update(x2+1,y2+1,z2+1);
            }
            else if(oper == 0)
            {
                 scanf("%d%d%d",&x1,&y1,&z1);
                 printf("%d\n",sum(x1,y1,z1)&1);
            }

        }
    }

    return 0;
}
复制代码

 

 

 

 











本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2012/11/29/2794959.html,如需转载请自行联系原作者

相关文章
|
6月前
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
22 0
|
6月前
poj 2352 Stars 树状数组
树状数组,简单题,我刚刚开始学的时候就a了,不多说什么了,直接贴代码。
19 0
|
6月前
Light oj 1112 - Curious Robin Hood(树状数组)
有n个数,有m组操作,1 i表示将第i个数先输出,然后置0, 2 i v 表示给第i个数加上v, 3 i j 表示求i 到 j 的和,注意,这里数组是从0开始的,而我们构造的树状数组是从1 开始的,使用在程序中要进行一定的处理。
23 0
|
8月前
|
人工智能
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
|
存储 测试技术
HDOJ(HDU) 2523 SORT AGAIN(推导排序、、)
HDOJ(HDU) 2523 SORT AGAIN(推导排序、、)
81 0
|
Java BI 机器学习/深度学习