Ural 1470. UFOs

来源:互联网 发布:易语言准星源码 编辑:程序博客网 时间:2024/06/05 02:24

三维树状数组,之前没有碰到过树状数组的问题,直接撞三维上的表示很蛋疼。拖了几天了,有点想不下去。然后看了下题解,发现自己略白痴。。。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;#define INF 100000000;#define N 130#define MIN(a,b) ((a)<(b)?(a):(b))int c[N][N][N];int n;int lowbit(int x){    return x&(-x);}int sum(int x,int y,int z){    int sum=0;    int x0=x,y0=y,z0=z;    while(x>0)    {        y=y0;        while(y>0)        {            z=z0;            while(z>0)            {                sum+=c[x][y][z];                z-=lowbit(z);            }            y-=lowbit(y);        }        x-=lowbit(x);    }    return sum;}void add(int x,int y,int z,int d){    int x0=x,y0=y,z0=z;    while(x<=n)    {        y=y0;        while(y<=n)        {            z=z0;            while(z<=n)            {                c[x][y][z]+=d;                z+=lowbit(z);            }            y+=lowbit(y);        }        x+=lowbit(x);    }}int main(){    scanf("%d",&n);    int m;    int x,y,z,k,x1,y1,z1;    while(scanf("%d",&m),m!=3)    {        if(m==1)        {            scanf("%d%d%d%d",&x,&y,&z,&k);            add(x+1,y+1,z+1,k);        }        else if(m==2)        {            scanf("%d%d%d%d%d%d",&x,&y,&z,&x1,&y1,&z1);            k=sum(x1+1,y1+1,z1+1)                    - sum(x1+1,y1+1,z) - sum(x1+1,y,z1+1) - sum(x,y1+1,z1+1)                    + sum(x,y,z1+1) + sum(x,y1+1,z) + sum(x1+1,y,z)                    - sum(x,y,z);            printf("%d\n",k);        }    }    return 0;}


原创粉丝点击