ural 1470 UFOs [树状数组]
2013-04-08 15:58
375 查看
题意:
对(0,0,0)到(128,128,128)的三维空间进行三种操作:(1)在点(x,y,z)增加V(可能为负);(2)查询(x1,y1,z1)到(x2,y2,z2)的数量和;(3)退出
三种操作是实时的。
思路:
可以向上一题一样采用线段树,但是需要三重线段树,编程复杂度有点高,于是简单的树状数组,查询的时候用差值。树状数组这里讲得比较清楚:click me
对(0,0,0)到(128,128,128)的三维空间进行三种操作:(1)在点(x,y,z)增加V(可能为负);(2)查询(x1,y1,z1)到(x2,y2,z2)的数量和;(3)退出
三种操作是实时的。
思路:
可以向上一题一样采用线段树,但是需要三重线段树,编程复杂度有点高,于是简单的树状数组,查询的时候用差值。树状数组这里讲得比较清楚:click me
#include <cstdio> #include <cstring> #define N 130 int c , n; void update(int px, int py, int pz, int val) { int x=px, y=py, z=pz; while (x <= n) { y = py; while (y <= n) { z = pz; while (z <= n) { c[x][y][z] += val; z += z&(-z); } y += y&(-y); } x += x&(-x); } } int quary(int px, int py, int pz) { int ret=0, x=px, y=py, z=pz; while (x > 0) { y = py; while (y > 0) { z = pz; while (z > 0) { ret += c[x][y][z]; z -= z&(-z); } y -= y&(-y); } x -= x&(-x); } return ret; } int main() { while (scanf("%d",&n) != EOF) { int tag; while (scanf("%d",&tag) && tag!=3) { if (tag == 1) { int x1,y1,z1,v; scanf("%d%d%d%d",&x1,&y1,&z1,&v); update(x1+1,y1+1,z1+1,v); } else if (tag == 2) { int x1,y1,z1,x2,y2,z2,v; scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2); v = quary(x2+1,y2+1,z2+1) - quary(x2+1,y2+1,z1) - quary(x2+1,y1,z2+1) - quary(x1,y2+1,z2+1) + quary(x1,y1,z2+1) + quary(x1,y2+1,z1) + quary(x2+1,y1,z1) - quary(x1,y1,z1); printf("%d\n", v); } } } }
相关文章推荐
- ural - 1470 - UFOs(树状数组)
- URAL - 1989 Subpalindromes hash & 树状数组 | 线段树
- ural1890、Timus1890【树状数组解法】
- URAL 2062 Ambitious Experiment(树状数组)
- Ural 1470. UFOs
- URAL 1470 二维数组数组
- URAL 1707. Hypnotoad's Secret(树状数组)
- ural1028 Stars (树状数组)
- Ural 1028 Stars(树状数组)
- URAL 1521 War Games 2 树状数组解决约瑟夫环,输出离队顺序
- URAL 1523.K-inversions (树状数组)
- Ural 1028. Stars(树状数组)
- ural - 1470 - UFOs(三维树状数组)
- Ural1090 (树状数组求逆序数)
- URAL - 1090 树状数组求逆序数
- UFOs(树状数组)
- Ural1470-UFOs
- URAL 2062 Ambitious Experiment (树状数组)
- ural 1028【树状数组】
- 树状数组复习 leetcode 307