我是靠谱客的博主 健壮钢笔,最近开发中收集的这篇文章主要介绍HDU 3584 Cube 三维树状数组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

题意:有一个立方体,初始每个格子都为0,可以对格子操作,把0变为1,把1变为0,最后询问某个格子最后的值 是多少。

思路:三维树状数组的应用,插线问点。

代码:

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;

const int N = 110;
int num[N][N][N];
int inline lowbit(int x){
	return x & (-x);
}
void inline update(int x,int y,int z,int add){
	int tempy = y,tempz = z;
	while(x > 0){
	   y = tempy;
	   while(y > 0){
	     z = tempz;
		 while(z > 0){
		    num[x][y][z] += add;
			z -= lowbit(z);
		 }
		 y -= lowbit(y);
	   }
	   x -= lowbit(x);
	}
}
int inline sum(int x,int y,int z){
	int tempy = y,tempz = z, s = 0;
	while(x < N){
	   y = tempy;
	   while(y < N){
	     z = tempz;
		 while(z < N){
		   s += num[x][y][z];
		   z += lowbit(z);
		 }
		 y += lowbit(y);
	   }
	   x += lowbit(x);
	}
	return s;
}
int main(){
	int n,m;
	while(scanf("%d%d",&n,&m) != EOF){
	   int x1,y1,z1,x2,y2,z2;
	   memset(num,0,sizeof(num));
	   int id;
	   while(m--){
	      scanf("%d",&id);
		  if(id == 1){
		    scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
			update(x2,y2,z2,1);
			update(x1-1,y2,z2,-1);
			update(x2,y1-1,z2,-1);
			update(x2,y2,z1-1,-1);
			update(x1-1,y1-1,z2,1);
			update(x1-1,y2,z1-1,1);
			update(x2,y1-1,z1-1,1);
			update(x1-1,y1-1,z1-1,-1);
		  }
		  else{
		    scanf("%d%d%d",&x1,&y1,&z1);
			if(sum(x1,y1,z1) % 2)
			   printf("1n");
			else
				printf("0n");
		  }
	   }
	}
	return 0;
}


最后

以上就是健壮钢笔为你收集整理的HDU 3584 Cube 三维树状数组的全部内容,希望文章能够帮你解决HDU 3584 Cube 三维树状数组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部