题目链接:【https://hihocoder.com/problemset/problem/1291】

题意:在《我的世界》游戏中放置沙盒,沙盒为体积为1的正方体,按顺序给你一些坐标,然后问你按上面的顺序在这些坐标上放置沙盒是否合法:判断合法的条件a:沙盒必须放置在地面上或者与另外的沙盒共面(只要共面就可以).b:必须从外部放入某个坐标,也就说要放置的坐标不能被沙盒包围,也不能从地面下放进去PS:(题中说的是极远点可以不经过沙盒和地面到达要放置的点)。

For 20% of the data, 1 <= N <= 1000, 1 <= x, y, z <= 10.

For 100% of the data, 1 <= N <= 100000, 1 <= x, y, z <= 100.

题解:我们先不管条件b,只看条件a,然后判断是否合法。放置完以后我们在再从最后一个点删除,具体做法是:(坐标都在 1 <= x, y, z <= 100.)放置完沙盒以后,我们在100*100*100这个立方体外边在建立一层空座标把上,左右,前后全部覆盖。表示没有被放沙盒,然后我们把所有的空坐标连接在一起放入并查集,然后我们从最后一个点开始删点,删去的点的坐标与上下左右前后(如果下不为地的话)的空左边建立联系放入并查集,然后判断这个删除的坐标与我们在表层建立的左边是不是有联系即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int dir[][] = {, , , , , -, , , , -, , , , , , , -, };
int E[maxn][maxn][maxn];
int X[ * * ], Y[ * * ], Z[ * * ];
int F[ * * ];
int Find(int u)
{
if(u == F[u]) return F[u];
else return F[u] = Find(F[u]);
}
void adde(int u, int v)
{
int x = Find(u);
int y = Find(v);
if(x != y) F[x] = y;
}
int main ()
{
int T, n;
scanf("%d", &T);
while(T--)
{
memset(E, , sizeof(E));
bool fg = ;
scanf("%d", &n);
for(int i = ; i <= n; i++)
{
scanf("%d%d%d", &X[i], &Y[i], &Z[i]);
if(!fg) continue;
if(E[X[i]][Y[i]][Z[i]]) fg = ;//重复放木块
E[X[i]][Y[i]][Z[i]] = ;
if(Z[i] == ) continue;//放在地上
int d = ;
for(d = ; d < ; d++)
{
int x = X[i] + dir[d][];
int y = Y[i] + dir[d][];
int z = Z[i] + dir[d][];
if(E[x][y][z]) break;
}
if(d == ) fg = ;
}
if(!fg)
{
printf("No\n");
continue;
} for(int i = ; i <= * * + * + ; i++)
F[i] = i;
for(int i = ; i <= ; i++)//横坐标
for(int j = ; j <= ; j++)//纵坐标
for(int k = ; k <= ; k++)//竖坐标
{
if(!E[i][j][k])
for(int d = ; d < ; d++)
{
int x = i + dir[d][];
int y = j + dir[d][];
int z = k + dir[d][];
if(x >= && x <= && y >= && y <= && z >= && z <= && !E[x][y][z])
adde(i * * + j * + k, x * * + y * + z);
}
}
for(int i = n; i >= ; i--)
{
E[X[i]][Y[i]][Z[i]] = ;
for(int d = ; d < ; d++)
{
int x = X[i] + dir[d][];
int y = Y[i] + dir[d][];
int z = Z[i] + dir[d][];
if(x >= && x <= && y >= && y <= && z >= && z <= && !E[x][y][z])
adde(X[i] * * + Y[i] * + Z[i], x * * + y * + z);
}
int x = Find(X[i] * * + Y[i] * + Z[i]);
int y = Find( * * + * + );
if(x != y)
{
fg = ;
break;
}
}
if(fg) printf("Yes\n");
else printf("No\n");
}
return ;
}

hiho1291(逆序思维,并查集)的更多相关文章

  1. cf 之lis+贪心+思维+并查集

    https://codeforces.com/contest/1257/problem/E 题意:有三个集合集合里面的数字可以随意变换位置,不同集合的数字,如从第一个A集合取一个数字到B集合那操作数+ ...

  2. 思维+并查集 hdu5652

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...

  3. Gym - 101243F Vitamins(思维+并查集)

    题意 有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’ 题解 如果1<2<3,只要找到2就能确定1和3的颜色 如果2=4,只要确 ...

  4. BNU 4096 逆序 思维题

    https://www.bnuoj.com/v3/problem_show.php?pid=4096 对于一个序列a,我们定义它的逆序数为满足a[i]>a[j]且i<j的有序对<i, ...

  5. 牛客网多校第4场 J Hash Function 【思维+并查集建边】

    题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...

  6. codeforces 1013B 【思维+并查集建边】

    题目链接:戳这里 转自:参考博客 题意:给一个n*m的矩阵,放入q个点,这q个点之间的关系是,若已知这样三个点(x1,y1),(x2,y1),(x1,y2),可以在(x2,y2)处生成一个新的点,对于 ...

  7. CodeForces - 1243D (思维+并查集)

    题意 https://vjudge.net/problem/CodeForces-1243D 有一张完全图,n个节点 有m条边的边权为1,其余的都为0 这m条边会给你 问你这张图的最小生成树的权值 思 ...

  8. UVALive 6910 Cutting Tree(并查集应用)

    总体来说,这个题给的时间比较长,样例也是比较弱的,别的方法也能做出来. 我第一次使用的是不合并路径的并查集,几乎是一种暴力,花了600多MS,感觉还是不太好的,发现AC的人很多都在300MS之内的过得 ...

  9. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

随机推荐

  1. 数据库 插入时 碰到NULL报错判断的一种方法(技巧)

    //public static object ToDBNull(object value) 判断插入数据的时候个别参数不能为空的时候做的判断方法 //{ // if (value == null) / ...

  2. javascript操作对象的方法

    with 确定某个对象的作用区域,在with代码段内的次对象的属性或方法可以直接使用. 例: //比如stu中有name,age属性和walk方法 with(stu) { alert(name+&qu ...

  3. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  4. 2017ACM暑期多校联合训练 - Team 7 1009 HDU 6128 Inverse of sum (数学计算)

    题目链接 Problem Description There are n nonnegative integers a1-n which are less than p. HazelFan wants ...

  5. android内存回收顺序

    最近做项目的时候,经常会考虑到系统回收进程,释放资源等问题.特别查找了相关资料,了解下android内存回收顺序以及回收场景. 下面内容都为网络查找资料,若有错误,欢迎指出. 以下顺序,依次被回收的可 ...

  6. python进阶之py文件内置属性

    前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...

  7. Django 1.10文档中文版Part1

    目录 第一章.Django1.10文档组成结构1.1 获取帮助1.2 文档的组织形式1.3 第一步1.4 模型层1.5 视图层1.6 模板层1.7 表单1.8 开发流程1.9 admin站点1.10 ...

  8. javaScript如何跳出多重循环break、continue

    先来说说break和continue之间的区别 for(var i=0;i<10;i++){  if(i>5){  break;  }}console.log(i);  ---6  •当i ...

  9. SVM资料

    解释SMO算法比较好的文档 http://wenku.baidu.com/view/aeba21be960590c69ec3769e.html 参考博客: http://myjuno.blogbus. ...

  10. python快速教程-vamei

    2016年10月26日 12:00:53 今天开始着手python的学习,希望能高效快速的学完! Python基础(上)... 7 实验简介... 7 一.实验说明... 8 1. 环境登录... 8 ...