题目链接

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

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. jQuery中文学习站点

    jQuery是一个快速.简单的Javascript library,它简化了HTML文件的traversing,事件处理.动画.Ajax互动,从而方便了网页制作的快速发展.jQuery是为改变你编写J ...

  2. win32应用禁止改变窗口大小方法

    一种简单的处理方法是在调用CreateWindow函数时指定的窗口样式中去掉WS_THICKFRAME样式. 如果你使用的样式中已经包含该样式,例如WS_OVERLAPPEDWINDOW,我们可以將W ...

  3. Android Studio配置GreenDAO 3.2.0和使用方法

    我相信,在平时的开发过程中,大家一定会或多或少地接触到SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写SQL语句与解析查询结果等.所以,适用于Android ORM框架也就孕育而生了 ...

  4. css3新增的属性有哪些

    徐先森讲web CSS3新增的属性有哪些: CSS 用于控制网页的样式和布局. CSS3 是最新的 CSS 标准. CSS3新增了很多的属性,下面一起来分析一下新增的一些属性: 1.CSS3边框: b ...

  5. springcloud关键词解释和基础代码

    原文来自某位大神(不诉薄凉),感觉很好,分享出来. SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么 ...

  6. ansible yum 模块 安装 vsftp

    [root@ftp:/root] > ansible ansible01 -u root -k -m yum -a 'name=vsftpd state=latest' SSH password ...

  7. 洛谷 P1313 计算系数 (二项式定理)

    这道题正好复习了二项式定理 所以答案就是a^n * b^m * c(n, k) 然后注意一些细节 我一开始写组合数只写一行的组合数 即c[0] = 1; c[i] = c[i-1] * (n - i ...

  8. oracle查询表空间的位置

    SELECT * FROM Dba_Data_Files ddf WHERE ddf.tablespace_name = 'TablespaceName'; 以上SQL代码可以查询出表空间的所在路径和 ...

  9. 2015 Multi-University Training Contest 7 hdu 5375 Gray code

    Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  10. HDU 4253 Two Famous Companies

    Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...