当前位置:编程学习 > C/C++ >>

HDU 3584 Cube 三维树状数组

题意:有一个立方体,初始每个格子都为0,可以对格子操作,把0变为1,把1变为0,最后询问某个格子最后的值 是多少。
思路:三维树状数组的应用,插线问点。
代码:
[cpp]
#include <iostream> 
#include <cstdio> 
#include <string.h> 
using namespace std; 
 
const int N = 110; 
int num[N][N][N]; 
int inline lowbit(int x){ 
    return x & (-x); 

void inline update(int x,int y,int z,int add){ 
    int tempy = y,tempz = z; 
    while(x > 0){ 
       y = tempy; 
       while(y > 0){ 
         z = tempz; 
         while(z > 0){ 
            num[x][y][z] += add; 
            z -= lowbit(z); 
         } 
         y -= lowbit(y); 
       } 
       x -= lowbit(x); 
    } 

int inline sum(int x,int y,int z){ 
    int tempy = y,tempz = z, s = 0; 
    while(x < N){ 
       y = tempy; 
       while(y < N){ 
         z = tempz; 
         while(z < N){ 
           s += num[x][y][z]; 
           z += lowbit(z); 
         } 
         y += lowbit(y); 
       } 
       x += lowbit(x); 
    } 
    return s; 

int main(){ 
    int n,m; 
    while(scanf("%d%d",&n,&m) != EOF){ 
       int x1,y1,z1,x2,y2,z2; 
       memset(num,0,sizeof(num)); 
       int id; 
       while(m--){ 
          scanf("%d",&id); 
          if(id == 1){ 
            scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2); 
            update(x2,y2,z2,1); 
            update(x1-1,y2,z2,-1); 
            update(x2,y1-1,z2,-1); 
            update(x2,y2,z1-1,-1); 
            update(x1-1,y1-1,z2,1); 
            update(x1-1,y2,z1-1,1); 
            update(x2,y1-1,z1-1,1); 
            update(x1-1,y1-1,z1-1,-1); 
          }  www.zzzyk.com
          else{ 
            scanf("%d%d%d",&x1,&y1,&z1); 
            if(sum(x1,y1,z1) % 2) 
               printf("1\n"); 
            else 
                printf("0\n"); 
          } 
       } 
    } 
    return 0; 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,