我是靠谱客的博主 聪慧跳跳糖,这篇文章主要介绍hdu 3584 Cube(三维树状数组),现在分享给大家,希望可以做个参考。

题意

n*n*n空间内,对一个以(x1, y1, z1), (x2, y2, z2)连成的线为体对角线的长方体的值取反,查询(x,y,z)的值。初始值为0


解题思路:

用三维树状数组区间更新单点查询。

三维的树状数组容斥起来麻烦一点。


代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <bits/stdc++.h> using namespace std; int n, m; int bit[105][105][105]; int lowbit(int x) { return x&-x; } int query(int x, int y, int z) { int res=0, i, j, k; for(i=x; i<=n; i+=lowbit(i)) { for(j=y; j<=n; j+=lowbit(j)) { for(k=z; k<=n; k+=lowbit(k)) { res+=bit[i][j][k]; // res=(res%2+2)%2; } } } return res; } void add(int x, int y, int z, int e) { int i, j, k; for(i=x; i>0; i-=lowbit(i)) { for(j=y; j>0; j-=lowbit(j)) { for(k=z; k>0; k-=lowbit(k)) { bit[i][j][k]=((bit[i][j][k]+e)); } } } return; } int main() { int i, j; int x, y, z, a, b, c; while(~scanf("%d%d", &n, &m)) { int e, i, j, k; memset(bit, 0, sizeof bit); while(m--) { scanf("%d", &e); if(e==1) { scanf("%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c); add(a, b, c,1),add(a,b,z-1,-1),add(a,y-1,c, -1),add(x-1,b,c,-1),add(x-1,y-1,c, 1),add(x-1,b,z-1, 1),add(a,y-1,z-1,1),add(x-1, y-1, z-1,-1); } else { scanf("%d%d%d", &x, &y, &z); // if(query(x,y,z)%2==0)printf("0n"); // else printf("1n"); printf("%dn", (query(x, y, z))%2); } } } }


最后

以上就是聪慧跳跳糖最近收集整理的关于hdu 3584 Cube(三维树状数组)的全部内容,更多相关hdu内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部