程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3584 Cube 三維樹狀數組

HDU 3584 Cube 三維樹狀數組

編輯:C++入門知識

題意:有一個立方體,初始每個格子都為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.2cto.com
          else{ 
            scanf("%d%d%d",&x1,&y1,&z1); 
            if(sum(x1,y1,z1) % 2) 
               printf("1\n"); 
            else 
                printf("0\n"); 
          } 
       } 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved