Description
Vasya is a ufologist and his duties include observing Unidentified Flying Objects (UFOs) in the part of space bounded by a cube
N ×
N ×
N. The cube is divided into cubic sectors 1 × 1 × 1. During the observation, the following events may happen:
- several new UFOs emerge in a certain sector;
- several UFOs disappear in a certain sector;
- Vasya's boss may ask him how many UFOs there are in a part of space consisting of several sectors.
Input
The first line contains an integer
N (1 ≤
N ≤ 128). The coordinates of sectors are integers from 0 to
N–1.
Then there are entries describing events, one entry per line. Each entry starts with a number
M.
- If M is 1, then this number is followed by four integers x (0 ≤ x < N), y (0 ≤ y < N), z (0 ≤ z < N), K (–20000 ≤ K ≤ 20000), which are coordinates of a sector and the change in the number of UFOs in this sector. The number of UFOs in a sector cannot become negative.
- If M is 2, then this number is followed by six integers x1, y1, z1, x2, y2, z2 (0 ≤ x1 ≤ x2 < N, 0 ≤ y1 ≤ y2 < N, 0 ≤ z1 ≤ z2 < N), which mean that Vasya must compute the total number of UFOs in sectors (x, y, z) belonging to the volume: x1 ≤ x ≤ x2, y1 ≤ y ≤ y2, z1 ≤ z≤ z2.
- If M is 3, it means that Vasya is tired and goes to sleep. This entry is always the last one.
Output
For each query, output in a separate line the required number of UFOs.
Sample Input
input | output |
---|---|
2 2 1 1 1 1 1 1 1 0 0 0 1 1 0 1 0 3 2 0 0 0 0 0 0 2 0 0 0 0 1 0 1 0 1 0 -2 2 0 0 0 1 1 1 3 | 0 1 4 2 |
解题思路:
貌似树状数组不太有用三维的,不过这题用三维还是非常方便的。之前做了道Mobile phones,跟这道没什么区别。三维需要的注意的就是如何减去重复的空间,有一个空间重复了2次,还有三个空间重复了1次,讲也不太能讲的清楚,自己拿笔把立方体画出来并进行分割就行。代码写的比较挫。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 130;
int c[maxn][maxn][maxn], n;
int lowbit(int a)
{
return a & (-a);
}
void Update(int x,int y,int z,int a)
{
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))
c[i][j][k] += a;
}
int Sum(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 += c[i][j][k];
return sum;
}
int main()
{
int m, x, y, z, a, x1, y1, z1, x2, y2, z2;
memset(c, 0, sizeof(c));
scanf("%d",&n);
while(scanf("%d", &m))
{
if(m == 3)
break;
if(m == 1)
{
scanf("%d%d%d%d", &x, &y, &z, &a);
Update(x + 1, y + 1, z + 1, a);
}
if(m == 2)
{
scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2);
int a = Sum(x2 + 1, y2 + 1, z2 + 1);
int b = Sum(x1, y2 + 1, z2 + 1);
int c = Sum(x2 + 1, y1, z2 + 1);
int d = Sum(x2 + 1, y2 + 1, z1);
int e = Sum(x1, y1, z1);
int f = Sum(x1, y2 + 1, z1);
int g = Sum(x1, y1, z2 + 1);
int h = Sum(x2 + 1, y1, z1);
printf("%d\n", a - b - c - d - e + f + g + h);
}
}
return 0;
}