hiho151周*
题目大意:依次在给定的三维坐标上垒方块,对于一个新的坐标需满足两个条件
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周*的更多相关文章
- 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中
Autodesk 软件(中国)有限公司 ADN 市场部真诚地邀请您参加我们一年一度的 "Autodesk 开发者日"(简称 DevDays),以及第一次随同开发者日举办的" ...
- 记一周cdqz训练
#include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...
- java第三周学习
这一周学习的是java数组面向对象 数组中存放的数据的类型:既可以是基本数据类型也可以是引用数据类型. 数组的定义方式: 1 数据类型[] 数组名; 2 数据类型 数组名[]; 数组的初始化: 1.静 ...
- java第二周周学习总结
java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){ 执行语句; //一段代码} 初始化表达式:初 ...
- my97DatePicker选择年、季度、月、周、日
My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 下面总结下使用该日历控件选择年.季度.月.周.日的方法. .选择年 <input id="d1212" ...
- 第16周界面设计PSP总结
计划:需1周完整完成 需求分析:作为一个观众,我希望能够了解每一场的比分结果,随时跟进比赛进程 生成设计文档:暂无 设计复审:暂无与组员进行设计复审 代码规范:Visual Studio2010 具体 ...
- 三周,用长轮询实现Chat并迁移到Azure测试
公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都花在这上面了.简单地说就是用MVC4基于长 ...
- 根据起止日期构建指定查询条件:第N周(yyyy-MM-dd/yyyy-MM-dd)
项目中有个查询模块中用到查询条件: 年和周. 以往我直接指定是第几周,后来测试反映如果直接选择周的话并不知道所选周代表的年月日,而无法最快查询数据,后更改查询条件如下: 指定一个起始年月,根据起始年月 ...
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
随机推荐
- View的呈现(二)加载流程
这块涉及到Code+Razor模板=>html[output流] 而这块的问题在于Razor最后生成了什么?--对象:一个类文件:eg:index.cshtml => index_cst ...
- 在64位linux上编译32位程序 for i386 intel
编辑中 # ld -V GNU ld version 2.15.92.0.2 20040927 Supported emulations: elf_x86_64 elf_i386 i386linux ...
- json字符串与json对象的相互转换
什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSO ...
- 尝试实现bootstrap3网格系统
这是一篇搁置了很久的博文,个人实现的关键代码如下: // 这是用sass实现的,只是大致实现了网格系统和offset的功能 $size_list: ( xs: 0, sm: 576, md: 992, ...
- 自定义view 之多个引导层动画效果
SupernatantView 如果我英文还可以的话这个应该叫做漂浮在上层的view---引导层 今天闲来无事看了网上的一些引导层案例总感觉如果不是很舒服,就是类似于很死板的显示和消失 我在想能不能弄 ...
- Unity 获取坐标函数 坐标转换函数
获取世界坐标:transform.position 获取本地坐标:transform.localPosition 获取鼠标坐标:Input.mousePosition 获取手指触摸区域坐标:Input ...
- UVALive-8079 Making a Team 排列组合公式化简
题目链接:https://cn.vjudge.net/problem/UVALive-8079 题意 n个人组队,队伍人数小于等于n,每个队伍需要4个不同的职务的领导. 问这n个人可以组成多少队? n ...
- com.jasson.im.api.APIClient jar包 下载
包名:ImApi2.3.jar 链接: https://pan.baidu.com/s/1SgeufcaH6y_K-AJEKDZDtw 提取码: 3v78 复制这段内容后打开百度网盘手机App,操作更 ...
- MHA 主从切换过程及日志分析
本文主要在MHA 切换日志的角度分析MHA切换的过.MHA故障切换过程如下图所示 第一部分:开启MHA 监控 通过分析日志,得到以下步骤: 1.读取MHA manager 节点的配置文件,并检查配置文 ...
- koa,express,node 通用方法连接MySQL
这个教程不管node,express,koa都可以用下面方法连接,这里用koa做个参考 这个教程的源码地址: https://github.com/xiaqijian/... 新建文件目录,我是这样子 ...