题目链接

题目大意:依次在给定的三维坐标上垒方块,对于一个新的坐标需满足两个条件

1:六个方向有相邻的方块或者z==1【题目说明了初始状态是:所有z==0的位置都有方块】

2:该位置存在一条到无穷远处的路径,即不能被已有的方块包围。

给定一个序列,问按照这个序列放置方块会不会违反上述两条规则。

1<=x,y,z<=100  N<=100000

-----------------------------------------------------------------------------------------------------

条件一容易判断。

条件二如果正序处理,则每来一个坐标都需要判断和无穷远处的连通性,复杂度很大。

则反过来处理,首先把空格子合并,分到几个集合里。然后倒着删方块,每删一个方块,就merge一下该

方块及周围的六个空格子,merge完后判断方块所在格子是否和无穷远处联通

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
const int N = ;
bool tag[N][N][N];
int father[N*N*N];
int ids[N][N][N];
int xs[],ys[],zs[];
int maxx,maxy,maxz;
int minx,miny,minz;
const int dir[][] = {{,,},{,,-},{,,},{,-,},{,,},{-,,}};
bool judge(int x,int y,int z){
if(z==) return false;
if(x<minx) return false;
if(x>maxx) return false;
if(y<miny) return false;
if(y>maxy) return false;
if(z<minz) return false;
if(z>maxz) return false;
return true;
}
int find(int id){
int fid = father[id];
if(fid==id) return fid;
return (father[id]=find(fid));
}
void merge(int a,int b){
int fa = find(a);
int fb = find(b);
if(fa==fb) return ;
father[fb] = fa;
} int main(){
int n,t;
for(int i=;i<;i++) for(int j=;j<;j++) for(int k=;k<;k++){
ids[i][j][k] = i*+j*+k;
}
for(scanf("%d",&t);t--;){
cin>>n;
memset(tag,false,sizeof(tag));
bool flag = true;
maxx=maxy=maxz=-OO;
minx=miny=minz=OO;
for(int i=;i<n;i++){
scanf("%d%d%d",xs+i,ys+i,zs+i);
maxx=MAX(maxx,xs[i]);maxy=MAX(maxy,ys[i]);maxz=MAX(maxz,zs[i]);
minx=MIN(minx,xs[i]);miny=MIN(miny,ys[i]);minz=MIN(minz,zs[i]); if(tag[xs[i]][ys[i]][zs[i]]) flag = false;
else if(zs[i]==){
tag[xs[i]][ys[i]][zs[i]] = true;
}
else{
for(int d=;d<;d++){
int tx = xs[i]+dir[d][];
int ty = ys[i]+dir[d][];
int tz = zs[i]+dir[d][];
if(tag[tx][ty][tz]){
tag[xs[i]][ys[i]][zs[i]] = true;
break;
}
}
if(!tag[xs[i]][ys[i]][zs[i]]) flag = false;
}
}
if(!flag) puts("No");
else{
minx--;miny--;minz--;
maxx++;maxy++;maxz++;
for(int id=ids[minx][miny][minz];id<=ids[maxx][maxy][maxz];id++) father[id] = id;
for(int i=minx;i<=maxx;i++)
for(int j=miny;j<=maxy;j++)
for(int k=minz;k<=maxz;k++){
if((k!=)&&(!tag[i][j][k])){
for(int d=;d<;d++){
int ti = i+dir[d][];
int tj = j+dir[d][];
int tk = k+dir[d][];
if(judge(ti,tj,tk)&&(!tag[ti][tj][tk])){
merge(ids[i][j][k],ids[ti][tj][tk]);
}
}
}
} int ancestor = ids[maxx][maxy][maxz];
for(int i=n-;i>=;i--){
if(!flag) break;
int curId = ids[xs[i]][ys[i]][zs[i]];
for(int d=;d<;d++){
int tx = xs[i]+dir[d][];
int ty = ys[i]+dir[d][];
int tz = zs[i]+dir[d][];
if(judge(tx,ty,tz)&&(!tag[tx][ty][tz])){
merge(curId,ids[tx][ty][tz]);
}
}
if(find(curId)!=find(ancestor)){
flag = false;
}
else{
tag[xs[i]][ys[i]][zs[i]]=false;
}
}
if(!flag) puts("No");
else puts("Yes");
}
}
return ;
}

hiho151周*的更多相关文章

  1. 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中

    Autodesk 软件(中国)有限公司 ADN 市场部真诚地邀请您参加我们一年一度的 "Autodesk 开发者日"(简称 DevDays),以及第一次随同开发者日举办的" ...

  2. 记一周cdqz训练

    #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...

  3. java第三周学习

    这一周学习的是java数组面向对象 数组中存放的数据的类型:既可以是基本数据类型也可以是引用数据类型. 数组的定义方式: 1 数据类型[] 数组名; 2 数据类型 数组名[]; 数组的初始化: 1.静 ...

  4. java第二周周学习总结

    java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){    执行语句;   //一段代码} 初始化表达式:初 ...

  5. my97DatePicker选择年、季度、月、周、日

    My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 下面总结下使用该日历控件选择年.季度.月.周.日的方法. .选择年 <input id="d1212" ...

  6. 第16周界面设计PSP总结

    计划:需1周完整完成 需求分析:作为一个观众,我希望能够了解每一场的比分结果,随时跟进比赛进程 生成设计文档:暂无 设计复审:暂无与组员进行设计复审 代码规范:Visual Studio2010 具体 ...

  7. 三周,用长轮询实现Chat并迁移到Azure测试

    公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都花在这上面了.简单地说就是用MVC4基于长 ...

  8. 根据起止日期构建指定查询条件:第N周(yyyy-MM-dd/yyyy-MM-dd)

    项目中有个查询模块中用到查询条件: 年和周. 以往我直接指定是第几周,后来测试反映如果直接选择周的话并不知道所选周代表的年月日,而无法最快查询数据,后更改查询条件如下: 指定一个起始年月,根据起始年月 ...

  9. 第0/24周 SQL Server 性能调优培训引言

    大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...

随机推荐

  1. SQL Server 获取两个日期间的日期

    declare @start datetime declare @end datetime set @start = '2018-01-25' set @end = '2018-02-03' sele ...

  2. Sql Server远程还原

    1.假设备份文件xxxx.bak大小约300G,还原后所占用的空间为900G 2.磁盘空间只有1T,若将备份文件拷贝过来,空间剩余700G,无法成功还原,因此通过远程方式还原. 例子如下: SQLSE ...

  3. Win8 Windows Defender default behaviour

    Problem Description ********************* Is it possible, to change the default behaviour when findi ...

  4. github踩坑之git命令收集与整理(windows)

    最近开始又捡起git,第一家公司用的就是git,一直掌握的也不深刻,就知道常用的几个命令,虽然现在用svn,但是觉得git还是不能丢,遂又捡起来了.先总结一部分目前练习用到的,慢慢填补吧~ githu ...

  5. Smalltalk

    Smalltalk is an object-oriented, dynamically typed, reflective programming language. Smalltalk was o ...

  6. ONGUI->NGUI->UGUI (Unity UI史)

    各GUI的介绍 ONGUI:Unity自带的绘制界面工具,它的成像原理是基于表层的,所以执行效率非常的低,并且没有提供复杂的UI的接口,就算开发者硬着头皮写上去只能让UI的执行效率更低. NGUI:第 ...

  7. 脚本_使用expect自动交互远程主机安装软件

    #!bin/bash#功能:使用expect工具自动交互密码,远程到其它主机,安装httpd软件#作者:liusingbon#删除~/.ssh/known-hosts后,ssh远程任何主机,系统都会询 ...

  8. JavaScript中的线程与进程

    定义: 线程分为:单线程和多线程 单线程:一个正在运行的程序(即进行)至少有一个线程,这个线程叫做主线程,只有一个主线程的程序叫做单线程程序,主线程负责执行所有代码的执行(UI展现及刷新.网络请求.本 ...

  9. MongoDB入门 常用命令以及增删改查的简单操作

    1,运行MongoDB服务mongod --dbpath=/usr/local/developmentTool/mongo/data/db/然后启动客户端mongo2,sudo service mon ...

  10. poj 3420 Quad Tiling (状压dp+多米诺骨牌问题+矩阵快速幂)

    还有这种操作?????? 直接用pre到now转移的方式构造一个矩阵就好了. 二进制长度为m,就构造一个长度为1 << m的矩阵 最后输出ans[(1 << m) - 1][( ...