题目链接

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

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. layui序章

    layui,layer,laydate关系图,layer和laydate作为layui的独立模块存在 下载地址:layer.layui.com

  2. JS实现掷骰子

    JS实现掷骰子 实现方法: 方法一:通过background-position.background-image.backg-repeat三个属性以及jquery animate()方法改变背景骰子图 ...

  3. 关于在bootstrap的tab栏中渲染echats图表,切换tab时echats不显示问题

    在开发过程中遇到这样个问题: 利用bootstrap中的tab栏,每当点击tab栏的导航时,echats仅仅只渲染第一个tab的内容,切换tab时,echats图表不显示. 其html代码为: < ...

  4. Lambda 表达式-即匿名函数

    拉姆达值(Lambda),希腊字母表示为Λ,指与真空的空间有关的能量或暗能量.   代表转换的常量.或者转换本身.   Lambda 表达式 Lambda 表达式”是一个匿名函数,可以包含表达式和语句 ...

  5. 2015 Objective-C 新特性

    Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时,也有很多像我一样工作上依然 ...

  6. uva 11300 Spreading the Wealth_数学推倒 + 思维

    这道题和负载平衡问题是同一道题, 如果 n<=100n <= 100n<=100 的话是可以用最小费用流来求解的. 但是题中 nnn 最大可达到 10610^6106, 这就需要我们 ...

  7. 使用sourceMap文件定位小程序错误信息

    sourceMap是什么 在前端开发过程中代码难免会有错误,即便是再小心,也有可能出现 Cannot read property 'xxx' of null 这样的低级失误,debug自然是家常便饭. ...

  8. Manacher(最大回文字串)

    很好的讲解 注意两端的字符要不同,同时数组要开大一些 [Manacher]最长回文子串 #include<bits/stdc++.h> #define REP(i, a, b) for(r ...

  9. [luogu] P4364 [九省联考2018]IIIDX(贪心)

    P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ...

  10. JavaScript div 上下运动实例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...