HDU_3584_Cube
这题为啥用树状数组呢?
首先1<=N<=100,如果暴力修改的话,最糟糕的时间为O(N*N*N),然后有M个命令,1<=M<=10000,总耗时为O(M*N*N*N),也就是100*100*100*10000,而限时1s,神仙难救~
如果把修改次数看成前缀和,修改次数为奇数,答案则为1,修改次数为偶数,则为0,总的耗时为Q(M*logN*logN*logN),随意可过~
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<queue> using namespace std; #define N 105 int c[N][N][N],n,m; int sum(int x,int y,int z) { int ret=0,i,j,k; for(i=x;i;i-=(i&-i)) for(j=y;j;j-=(j&-j)) for(k=z;k;k-=(k&-k)) ret+=c[i][j][k]; return ret; } void add(int x,int y,int z,int d) { int i,j,k; for(i=x;i<=n;i+=(i&-i)) for(j=y;j<=n;j+=(j&-j)) for(k=z;k<=n;k+=(k&-k)) c[i][j][k]+=d; } int main() { int q,x1,y1,z1,x2,y2,z2; while(~scanf("%d%d",&n,&m)) { memset(c,0,sizeof(c)); while(m--) { scanf("%d",&q); if(q==1) { scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2); /*一言难尽啊~,自己找个长方体模拟一下吧*/ add(x2+1,y2+1,z2+1,1); add(x1,y2+1,z2+1,1); add(x2+1,y1,z2+1,1); add(x1,y1,z2+1,1); add(x1,y2+1,z1,1); add(x2+1,y1,z1,1); add(x2+1,y2+1,z1,1); add(x1,y1,z1,1); } else { scanf("%d%d%d",&x1,&y1,&z1); printf("%d\n",sum(x1,y1,z1)&1); } } } return 0; }