hdu-3584 Cube---三维树状数组+区域更新单点查询
Posted 努力努力再努力x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-3584 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]的值。
解题思路:
三维树状数组模拟,利用容斥原理
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<string> 6 #include<cmath> 7 #include<set> 8 #include<queue> 9 #include<map> 10 #include<stack> 11 #include<vector> 12 #include<list> 13 #include<deque> 14 #include<sstream> 15 #include<cctype> 16 #define REP(i, n) for(int i = 0; i < (n); i++) 17 #define FOR(i, s, t) for(int i = (s); i < (t); i++) 18 #define MEM(a, x) memset(a, x, sizeof(a)); 19 using namespace std; 20 typedef long long ll; 21 typedef unsigned long long ull; 22 const int maxn = 105; 23 const double eps = 1e-10; 24 const int INF = 1 << 30; 25 const int dir[4][2] = {1,0,0,1,0,-1,-1,0}; 26 const double pi = 3.1415926535898; 27 int T, n, m, cases; 28 int tree[maxn][maxn][maxn]; 29 int a[maxn][maxn][maxn]; 30 int lowbit(int x) 31 { 32 return x&(-x); 33 } 34 int sum(int x, int y, int z) 35 { 36 int ans = 0; 37 for(int i = x; i <= n; i += lowbit(i)) 38 for(int j = y; j <= n; j += lowbit(j)) 39 for(int k = z; k <= n; k += lowbit(k)) 40 ans += tree[i][j][k]; 41 return ans; 42 } 43 void add(int x, int y, int z, int d) 44 { 45 for(int i = x; i > 0; i -= lowbit(i)) 46 for(int j = y; j > 0; j -= lowbit(j)) 47 for(int k = z; k > 0; k -= lowbit(k)) 48 tree[i][j][k] += d; 49 } 50 int main() 51 { 52 while(cin >> n >> m) 53 { 54 MEM(tree, 0); 55 MEM(a, 0); 56 int t, x1, y1, z1, x2, y2, z2; 57 while(m--) 58 { 59 scanf("%d", &t); 60 if(t) 61 { 62 scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2); 63 add(x2, y2, z2, 1); 64 add(x2, y1 - 1, z2, 1); 65 add(x1 - 1, y2, z2, 1); 66 add(x2, y2, z1 - 1, 1); 67 add(x1 - 1, y1 - 1, z2, 1); 68 add(x1 - 1, y2, z1 - 1, 1); 69 add(x2, y1 - 1, z1 - 1, 1); 70 add(x1 - 1, y1 - 1, z1 - 1, 1); 71 } 72 else 73 { 74 scanf("%d%d%d", &x1, &y1, &z1); 75 cout<<(sum(x1, y1, z1)&1)<<endl; 76 } 77 } 78 } 79 return 0; 80 }
以上是关于hdu-3584 Cube---三维树状数组+区域更新单点查询的主要内容,如果未能解决你的问题,请参考以下文章