zoukankan      html  css  js  c++  java
  • HDU 3584 Cube (三维 树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584

                                                  Cube

    Problem Description

    Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. Initially we have A[i, j, k] = 0 (1 <= i, j, k <= N). 
    We define two operations, 1: “Not” operation that we change the A[i, j, k]=!A[i, j, k]. that means we change A[i, j, k] from 0->1,or 1->0. (x1<=i<=x2,y1<=j<=y2,z1<=k<=z2).
    0: “Query” operation we want to get the value of A[i, j, k].

    Input

    Multi-cases.
    First line contains N and M, M lines follow indicating the operation below.
    Each operation contains an X, the type of operation. 1: “Not” operation and 0: “Query” operation.
    If X is 1, following x1, y1, z1, x2, y2, z2.
    If X is 0, following x, y, z.

    Output

    For each query output A[x, y, z] in one line. (1<=n<=100 sum of m <=10000) 

    Sample Input

    2 5

    1 1 1 1  1 1 1

    0 1 1 1

    1 1 1 1  2 2 2

    0 1 1 1

    0 2 2 2

    Sample Output

    1

    0

    1

     

     1 /*AC代码*/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 
     6 using namespace std;
     7 
     8 const int N=110;
     9 
    10 int n,m,arr[N][N][N];
    11 
    12 int lowbit(int x)
    13 {
    14     return x&(-x);
    15 }
    16 
    17 void update(int i,int j,int k,int val)
    18 {
    19     while(i<=n)
    20     {
    21         int tmpj=j;
    22         while(tmpj<=n)
    23         {
    24             int tmpk=k;
    25             while(tmpk<=n)
    26             {
    27                 arr[i][tmpj][tmpk]+=val;
    28                 tmpk+=lowbit(tmpk);
    29             }
    30             tmpj+=lowbit(tmpj);
    31         }
    32         i+=lowbit(i);
    33     }
    34 }
    35 
    36 int Sum(int i,int j,int k)
    37 {
    38     int ans=0;
    39     while(i>0)
    40     {
    41         int tmpj=j;
    42         while(tmpj>0)
    43         {
    44             int tmpk=k;
    45             while(tmpk>0)
    46             {
    47                 ans+=arr[i][tmpj][tmpk];
    48                 tmpk-=lowbit(tmpk);
    49             }
    50             tmpj-=lowbit(tmpj);
    51         }
    52         i-=lowbit(i);
    53     }
    54     return ans;
    55 }
    56 
    57 int main()
    58 {
    59 
    60     //freopen("input.txt","r",stdin);
    61 
    62     while(~scanf("%d%d",&n,&m))
    63     {
    64         memset(arr,0,sizeof(arr));
    65         int x1,y1,z1,x2,y2,z2;
    66         int op;
    67         while(m--)
    68         {
    69             scanf("%d",&op);
    70             if(op==1)
    71             {
    72                 scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
    73                 update(x2+1, y2+1, z2+1, 1);
    74                 update(x1, y2+1, z2+1, 1);
    75                 update(x2+1, y1, z2+1, 1);
    76                 update(x2+1, y2+1, z1, 1);
    77                 update(x1, y1, z2+1, 1);
    78                 update(x2+1, y1, z1, 1);
    79                 update(x1, y2+1, z1, 1);
    80                 update(x1, y1, z1, 1);
    81             }
    82             else
    83              {
    84                 scanf("%d%d%d",&x1,&y1,&z1);
    85                 printf("%d
    ",Sum(x1,y1,z1)&1);  
    86   //该点的值就是sum(x,y)
    87             }
    88         }
    89     }
    90     return 0;
    91 }
    View Code

    感觉三维应该和二维差不多   变一下下就好了

    但是我就是wa了  囧 照例,下面的代码 请无视

     1 /*wa代码*/
     2 #include<iostream>
     3 
     4 using namespace std;
     5 
     6 int N;
     7 int c[105][105][105];
     8 
     9 int lowbit( int x )
    10 {
    11     return x & (-x);
    12 }
    13 
    14 void update( int x, int y, int z, int delta )
    15 {
    16     int i, j , k;
    17     for(i=x; i<=N; i+=lowbit(i))
    18     {
    19         for(j=y; j<=N; j+=lowbit(j))
    20         {
    21             for(k=z ; k<=N; k+=lowbit(j))
    22                 c[i][j][k] += delta;
    23         }
    24     }
    25 }
    26 
    27 int sum( int x, int y , int z )
    28 {
    29     int res = 0, i, j , k;
    30     for(i=x; i>0; i-=lowbit(i))
    31     {
    32         for(j=y; j>0; j-=lowbit(j))
    33         {
    34             for(k=z; k>0; k-=lowbit(j))
    35                 {
    36                     res += c[i][j][k];
    37                 }
    38         }
    39     }
    40     return res;
    41 }
    42 
    43 
    44 void init ()
    45 {
    46     int i,j,k;
    47     for(i=0;i<=N;i++)
    48         for(j=0;j<=N;j++)
    49             for(k=0;k<=N;k++)
    50                 c[i][j][k]=0;
    51 }
    52 
    53 int main()
    54 {
    55     int x1,y1,z1,x2,y2,z2;
    56     int temp,p;
    57 
    58     while(scanf("%d%d%",&N,&p)!=EOF)
    59     {
    60         init ();
    61         while(p--)
    62         {
    63             scanf("%d",&temp);
    64             if(temp==1)
    65             {
    66             //    printf("input x1~z2
    ");
    67 
    68                 scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
    69                 update(x2+1, y2+1, z2+1, 1);
    70                 update(x1, y2+1, z2+1, 1);
    71                 update(x2+1, y1, z2+1, 1);
    72                 update(x2+1, y2+1, z1, 1);
    73                 update(x1, y1, z2+1, 1);
    74                 update(x2+1, y1, z1, 1);
    75                 update(x1, y2+1, z1, 1);
    76                 update(x1, y1, z1, 1);
    77             
    78             }
    79             else if(temp==0)
    80             {
    81                 scanf("%d%d%d",&x1,&y1,&z1);
    82                 printf("%d
    ",sum(x1,y1,z1)&1);
    83             }
    84         }
    85 }
    86     
    87     return 0 ;
    88 }
    View Code
  • 相关阅读:
    JAVA005-基本数据类型变量的存储
    JAVA003-变量、数据类型
    Python_pandas数据处理_学习
    python_性能FPS
    DB_004_创建表
    DB_003_关系数据库标准语言(SQL)
    DB_002_数据库的创建和管理
    DB_001_概念模型设计
    虚幻蓝图学习笔记 简单VR功能实现
    虚幻蓝图学习笔记 制作第一人称(实现功能:捡枪,换枪,扔枪,仍炸弹等)(一)
  • 原文地址:https://www.cnblogs.com/ws5167/p/3915587.html
Copyright © 2011-2022 走看看