ural - 1470 - UFOs(三维树状数组)

来源:互联网 发布:淘宝买药货到付款给谁 编辑:程序博客网 时间:2024/05/16 05:28



题意:由单位立方体组成的三维空间里,执行2种操作,一种是修改位置为(x, y, z)的ufo改变K个,另一种是询问空间(x1, y1, z1)-(x2, y2, z2)里的ufo数目(1 ≤ N ≤ 128, –20000 ≤ K ≤ 20000)。

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1470

——>>第一次刷的三维树状数组题目,有意思。。。#^_^。。。不过也没意思(只是比二维的多一层罢了。。。T_T)

小感:坐标有0,而树状数组从1开始计数,目前已形成条件反射,会加1后再计算了。。。得意。。。这个坑不到我啦。。。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include <cstdio>  
  2.   
  3. using namespace std;  
  4.   
  5. const int maxn = 128 + 10;  
  6.   
  7. int N;  
  8. int c[maxn][maxn][maxn];  
  9.   
  10. int lowerbit(int x) {  
  11.     return x & (-x);  
  12. }  
  13.   
  14. void add(int x, int y, int z, int v) {  
  15.     for(int i = x; i <= N; i += lowerbit(i))  
  16.         for(int j = y; j <= N; j += lowerbit(j))  
  17.             for(int k = z; k <= N; k += lowerbit(k))  
  18.                 c[i][j][k] += v;  
  19. }  
  20.   
  21. long long sum(int x, int y, int z) {  
  22.     long long ret = 0;  
  23.     for(int i = x; i > 0; i -= lowerbit(i))  
  24.         for(int j = y; j > 0; j -= lowerbit(j))  
  25.             for(int k = z; k > 0; k -= lowerbit(k))  
  26.                 ret += c[i][j][k];  
  27.     return ret;  
  28. }  
  29.   
  30. int main()  
  31. {  
  32.     int op;  
  33.     while(scanf("%d", &N) == 1) {  
  34.         while(scanf("%d", &op) && op != 3) {  
  35.             if(op == 1) {  
  36.                 int x, y, z, k;  
  37.                 scanf("%d%d%d%d", &x, &y, &z, &k);  
  38.                 add(x+1, y+1, z+1, k);  
  39.             }  
  40.             else {  
  41.                 int x1, y1, z1, x2, y2, z2;  
  42.                 scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2);  
  43.                 x1++; y1++; z1++;  
  44.                 x2++; y2++; z2++;  
  45.                 printf("%I64d\n", sum(x2, y2, z2)-sum(x2, y1-1, z2)-sum(x1-1, y2, z2)+sum(x1-1, y1-1, z2)  
  46.                        -(sum(x2, y2, z1-1)-sum(x2, y1-1, z1-1)-sum(x1-1, y2, z1-1)+sum(x1-1, y1-1, z1-1)));  
  47.             }  
  48.         }  
  49.     }  
  50.     return 0;  
  51. }  

0 0