您的位置:首页 > 其它

HDU_3584_Cube

2013-05-22 21:29 211 查看
这题为啥用树状数组呢?

首先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,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: