记录编号 |
148680 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[Vocaloid]细菌污染 |
最终得分 |
100 |
用户昵称 |
水中音 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.632 s |
提交时间 |
2015-02-14 11:56:12 |
内存使用 |
36.49 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int QWQ=1000000;
int X,Y,Z,h,w,n,zj1,zj2,zj3,i,tempx,tempy,tempz,ans=0,Sum1=0,Sum2=0,Sum3=0;
bool flag[101][101][101]={0},flag2[101][101][101]={0};
int setx[2][QWQ]={0},sety[2][QWQ]={0},setz[2][QWQ]={0};//当前分面接触侵染点的点
int waitx[QWQ]={0},waity[QWQ]={0},waitz[QWQ]={0};
int blood[101][101][101];//剩余生命值
int Addx[6]={0, 0,0, 0,1,-1};
int Addy[6]={0, 0,1,-1,0, 0};
int Addz[6]={1,-1,0, 0,0, 0};
//--------------输入--------------------------
void init()
{
scanf("%d%d%d",&X,&Y,&Z);
scanf("%d%d%d",&h,&w,&n);
for(zj1=1;zj1<=X;zj1++)
for(zj2=1;zj2<=Y;zj2++)
for(zj3=1;zj3<=Z;zj3++)
blood[zj1][zj2][zj3]=h;
int x_1,x_2,y_1,y_2,z_1,z_2;
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d%d%d",&x_1,&x_2,&y_1,&y_2,&z_1,&z_2);
for(zj1=x_1;zj1<=x_2;zj1++)
for(zj2=y_1;zj2<=y_2;zj2++)
for(zj3=z_1;zj3<=z_2;zj3++)
flag[zj1][zj2][zj3]=1,blood[zj1][zj2][zj3]=0;
}
}
//----------------------预处理----------------------------
void bfs(int x,int y,int z)
{
bool ok;
waitx[++Sum3]=x,waity[Sum3]=y,waitz[Sum3]=z,flag2[x][y][z]=1;
while(Sum3)
{
x=waitx[Sum3],y=waity[Sum3],z=waitz[Sum3],Sum3--,ok=0;
for(i=0;i<6;i++)
{
tempx=x+Addx[i],tempy=y+Addy[i],tempz=z+Addz[i];
if(tempx<=X&&tempx>0&&tempy<=Y&&tempy>0&&tempz<=Z&&tempz>0)
if(!flag[tempx][tempy][tempz])
{
if(!flag2[tempx][tempy][tempz])
{
waitx[++Sum3]=tempx,waity[Sum3]=tempy,waitz[Sum3]=tempz;
flag2[tempx][tempy][tempz]=1;
}
}
else ok=1;
}
if(ok)setx[0][++Sum1]=x,sety[0][Sum1]=y,setz[0][Sum1]=z;
}
}
void prework()
{
for(zj1=1;zj1<=X;zj1++)
for(zj2=1;zj2<=Y;zj2++)
for(zj3=1;zj3<=Z;zj3++)
if(!flag[zj1][zj2][zj3]&&!flag2[zj1][zj2][zj3])
bfs(zj1,zj2,zj3);
memset(flag2,0,sizeof(flag2));
for(i=1;i<=Sum1;i++)
flag2[setx[0][i]][sety[0][i]][setz[0][i]]=1;
}
//----------------------循环查找---------------------------
void work()
{
int x,y,z,num;
zj1=0,zj2=1;
while(Sum1)
{
ans++;
while(Sum1)
{
x=setx[zj1][Sum1],y=sety[zj1][Sum1],z=setz[zj1][Sum1],Sum1--,num=0;
for(i=0;i<6;i++)
{
tempx=x+Addx[i],tempy=y+Addy[i],tempz=z+Addz[i];
if(tempx<=X&&tempx>0&&tempy<=Y&&tempy>0&&tempz<=Z&&tempz>0)
if(flag[tempx][tempy][tempz])num++;
}
blood[x][y][z]-=num*w;
if(blood[x][y][z]<=0)waitx[++Sum3]=x,waity[Sum3]=y,waitz[Sum3]=z;
else setx[zj2][++Sum2]=x,sety[zj2][Sum2]=y,setz[zj2][Sum2]=z;
}
while(Sum3)
{
x=waitx[Sum3],y=waity[Sum3],z=waitz[Sum3],flag[x][y][z]=1,Sum3--;
for(i=0;i<6;i++)
{
tempx=x+Addx[i],tempy=y+Addy[i],tempz=z+Addz[i];
if(tempx<=X&&tempx>0&&tempy<=Y&&tempy>0&&tempz<=Z&&tempz>0)
if(blood[tempx][tempy][tempz]>0&&!flag2[tempx][tempy][tempz])
{
setx[zj2][++Sum2]=tempx,sety[zj2][Sum2]=tempy,setz[zj2][Sum2]=tempz;
flag2[tempx][tempy][tempz]=1;
}
}
}
zj1^=1,zj2^=1;
zj3=Sum1,Sum1=Sum2,Sum2=zj3;
}
printf("%d\n",ans);
}
int main()
{
freopen("Karune.in","r",stdin);
freopen("Karune.out","w",stdout);
init();
prework();
work();
//while(1);
return 0;
}