HDU 3584 Cube(三维树状数组)

原创 2013年12月03日 12:16:52

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

这个题目树状数组比较明显

由于只是两种变化,所以只要统计变化的次数就可以了

每次变化的是一个区间,更新的时候就按照点一样的更新方法

求和时求某个点的,其实就是求变化次数

任何一段在往下加的时候总能加到你更新的那个位置,如果加不到你也一定会加到你的某个

上司,没影响的也会加,不过更新的时候考虑到这个问题,把重复位置再次更新了一次,因为

奇偶变化,都+就行了!

#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 105;
int tree[maxn][maxn][maxn];
int n,m;
int lowbit(int x){
    return (-x)&x;
}
int sum(int i,int j,int k){
    int ans=0,now,then;
    while(i>0){
        now=j;
        while(now>0){
            then=k;
            while(then>0){
                ans+=tree[i][now][then];
                then-=lowbit(then);
            }
            now-=lowbit(now);
        }
        i-=lowbit(i);
    }
    return ans;
}
int update(int i,int j,int k){
    int now,then;
    while(i<=n){
        now=j;
        while(now<=n){
            then=k;
            while(then<=n){
                tree[i][now][then]++;
                then+=lowbit(then);
            }
            now+=lowbit(now);
        }
        i+=lowbit(i);
    }
    return 0;
}
int main(){
    int i,j,k;
    int no,x1,y1,z1,x2,y2,z2;
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(tree,0,sizeof(tree));
        for(i=0;i<m;i++){
            scanf("%d",&no);
            if(1==no){
                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(x2+1,y1,z2+1);
                update(x2+1,y2+1,z1);
                update(x1,y2+1,z2+1);
                update(x2+1,y1,z1);
                update(x2+1,y2+1,z2+1);
            }else{
                scanf("%d%d%d",&x1,&y1,&z1);
                printf("%d\n",sum(x1,y1,z1)%2);
            }
        }
    }
    return 0;
}


HDU3584 Cube【树状数组】【三维】

题目大意: 给定一个N*N*N多维数据集A,其元素是0或是1。A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值。 首先由A[i,j,k] = 0(1 ...
  • u011676797
  • u011676797
  • 2015年05月13日 12:38
  • 742

HDU 3584 Cube(三维树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584 题意:三维的空间中有两个操作,初始时每个空间元素均为0,更新操作是0变1,1变0,是一个空间内的...
  • u011523762
  • u011523762
  • 2016年08月10日 18:13
  • 144

hdu 3584 Cube(三维树状数组)

题意 n*n*n空间内,对一个以(x1, y1, z1), (x2, y2, z2)连成的线为体对角线的长方体的值取反,查询(x,y,z)的值。初始值为0 解题思路: 用三维树状数组区间...
  • johsnows
  • johsnows
  • 2017年04月21日 21:50
  • 264

HDU 3584 Cube --三维树状数组

题意:给一个三维数组n*n*n,初始都为0,每次有两个操作: 1. 翻转(x1,y1,z1) -> (x2,y2,z2) 0. 查询A[x][y][z] (A为该数组) 解法:树状数组维护操作次...
  • hq572241670
  • hq572241670
  • 2014年11月27日 18:44
  • 417

【树状数组(三维)】hdu 3584 Cube

http://acm.hdu.edu.cn/showproblem.php?pid=3584 分析:三维树状数组,按照二维猜出来的,统计改变的次数即可判断每个点状态 #include #incl...
  • yduqytd
  • yduqytd
  • 2014年01月31日 17:14
  • 338

HDU 3584 Cube(三维树状数组)

Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Su...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017年08月06日 22:25
  • 117

HDU 3584 Cube(三维树状数组)

问题描述: Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] mean...
  • sinat_34336698
  • sinat_34336698
  • 2016年10月10日 00:13
  • 151

HDU 3584 Cube(三维树状数组)

Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Su...
  • acm_BaiHuzi
  • acm_BaiHuzi
  • 2015年07月13日 12:21
  • 415

HDU 3584 Cube(三维BIT+容斥)

Description 给出一个全是0组成的三维数组,有两种操作: 0 x1 y1 z1 x2 y2 z2:把从点(x1,y1,z1)到点(x2,y2,z2)之间这个小正方体中所有元素反转,即由0...
  • V5ZSQ
  • V5ZSQ
  • 2015年09月08日 08:38
  • 269

HDU 3584 Cube (三维树状数组)

Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the n...
  • u013923947
  • u013923947
  • 2014年08月23日 00:16
  • 730
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3584 Cube(三维树状数组)
举报原因:
原因补充:

(最多只允许输入30个字)