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

2024-06-15 04:58

本文主要是介绍HDU3584 Cube【树状数组】【三维】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3584


题目大意:

给定一个N*N*N多维数据集A,其元素是0或是1。A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值。

首先由A[i,j,k] = 0(1 <= i,j,k <= N)。

给定两个操作:

1:改变A[i,j,k]为!A[i,j,k]。

2:查询A[i,j,k]的值。


思路:

三维树状数组区间更新、单点查询。更新区间(a,b)时,在 a 和 b+1 处都加1,前边表示增加1,后边是

抵消加1操作,最后询问时,用Query(x) % 2 即为单点的值(0或1)。三维区间更新,要注意区间的合并会

重复,所以要利用容斥原理,更新区间(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);


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 110;int Tree[MAXN][MAXN][MAXN],N,M;int Lowbit(int i)
{return i & (-i);
}void Update(int x,int y,int z)
{for(int i = x; i <= N; i += Lowbit(i))for(int j = y; j <= N; j += Lowbit(j))for(int k = z; k <= N; k += Lowbit(k))Tree[i][j][k]++;
}int Query(int x,int y,int z)
{int sum = 0;for(int i = x; i > 0; i -= Lowbit(i))for(int j = y; j > 0; j -= Lowbit(j))for(int k = z; k > 0; k -= Lowbit(k))sum += Tree[i][j][k];return sum;
}int main()
{while(cin >> N >> M){memset(Tree,0,sizeof(Tree));int op,x1,y1,z1,x2,y2,z2;while(M--){cin >> op;if(op == 0){cin >> x1 >> y1 >> z1;cout << Query(x1,y1,z1) % 2 << endl;}else{cin >> 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);}}}return 0;
}


这篇关于HDU3584 Cube【树状数组】【三维】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062488

相关文章

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[