题目链接:【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. 原创:HTML 头像截取上传 JS+PHP 整合包~

    关于: 关于头像上传这个东西,网上一搜乱七八糟的一堆然而很少很少有自己中意的插件一怒之下就自己写一个... 用法: <!DOCTYPE html> <html lang=" ...

  2. oozie与sqoop的简单案例

    1:拷贝模板 2:拷贝hive用的jar包 方式一: 3:编辑job.properties # # Licensed to the Apache Software Foundation (ASF) u ...

  3. CodeForces - 1004C

    Since Sonya is interested in robotics too, she decided to construct robots that will read and recogn ...

  4. Wireshark过滤语句中常用的操作符

    关键字有: eq,== 等于ne,!= 不等于gt,> 比…大lt,< 比…小 ge,>= 大于等于le,<= 小于等于 and,|| 且 or,&& 或 no ...

  5. linux的防火墙管理

    换oricle-linux7系统后,发现iptables的管理方法有不小的改动,记录一下遇到的问题. iptables linux系统已经默认安装了iptables和firewalld两款防火墙管理工 ...

  6. linux的curl用法【转】

    每分钟访问云签到任务执行页面.顺便记录了下curl的用法.以下内容摘自阮一峰博客. 一.查看网页源码 直接在curl命令后加上网址,就可以看到网页源码.我们以网址www.sina.com为例(选择该网 ...

  7. nfs挂载无法卸载

    故障现象:今天发现服务器的upload负载很高,到18左右,同时df查看磁盘命令卡住 用top\vmstat\iostat查看并未发现可以服务或进程. 上网查发现可能是nfs问题. 卸载nfs挂载的方 ...

  8. java基础7 封装

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  9. plsql实例精讲部分笔记

    转换sql: create or replace view v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,mo ...

  10. HDU 1285 确定比赛名次(拓扑排序模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意:有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行 ...