hdu 3584 Cube (三维树状数组,更新区间,查询单点)
三维树状数组
容斥那里注意一下。
多组数据因为忘记清空c数组而wa了1次,细心!
1/*************************************************************************
2 > File Name: code/hdu/3584.cpp
3 > Author: 111qqz
4 > Email: rkz2013@126.com
5 > Created Time: 2015年08月07日 星期五 14时01分53秒
6 ************************************************************************/
7
8#include<iostream>
9#include<iomanip>
10#include<cstdio>
11#include<algorithm>
12#include<cmath>
13#include<cstring>
14#include<string>
15#include<map>
16#include<set>
17#include<queue>
18#include<vector>
19#include<stack>
20#define y0 abc111qqz
21#define y1 hust111qqz
22#define yn hez111qqz
23#define j1 cute111qqz
24#define tm crazy111qqz
25#define lr dying111qqz
26using namespace std;
27#define REP(i, n) for (int i=0;i<int(n);++i)
28typedef long long LL;
29typedef unsigned long long ULL;
30const int inf = 0x7fffffff;
31const int N=1E2+5;
32int c[N][N][N];
33int n,m;
34int x1,y1,z1,x2,y2,z2;
35int lowbit( int x)
36{
37 return x&(-x);
38}
39void update ( int x,int y,int z,int delta)
40{
41 for ( int i = x; i <= n ; i = i + lowbit(i))
42 {
43 for ( int j = y ; j <= n ; j = j + lowbit(j))
44 {
45 for ( int k = z ; k <= n ; k = k + lowbit(k))
46 {
47 c[i][j][k] += delta;
48 }
49 }
50 }
51}
52
53int sum (int x,int y,int z)
54{
55 int res = 0;
56 for ( int i = x; i >= 1 ; i -= lowbit(i))
57 {
58 for ( int j = y ; j >= 1 ; j -= lowbit(j))
59 {
60 for ( int k = z ; k >= 1 ; k -= lowbit(k))
61 {
62 res = res + c[i][j][k];
63 }
64 }
65 }
66 return res;
67}
68int main()
69{
70 int op;
71 while (scanf("%d %d",&n,&m)!=EOF)
72 {
73 memset(c,0,sizeof(c));
74 for ( int i = 1 ; i <= m ; i ++ )
75 {
76 scanf("%d",&op);
77 if (op)
78 {
79 scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2);
80 update (x1,y1,z1,1);
81 update (x1,y1,z2+1,1);
82 update (x1,y2+1,z1,1);
83 update (x2+1,y1,z1,1);
84
85 update (x2+1,y2+1,z1,1);
86 update (x2+1,y1,z2+1,1);
87 update (x1,y2+1,z2+1,1);
88 update (x2+1,y2+1,z2+1,1);
89
90 }
91 else
92 {
93 scanf("%d %d %d",&x1,&y1,&z1);
94 cout<<sum(x1,y1,z1)%2<<endl;
95 }
96 }
97 }
98
99 return 0;
100}