hiho1291(逆序思维,并查集)
题目链接:【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(逆序思维,并查集)的更多相关文章
- cf 之lis+贪心+思维+并查集
https://codeforces.com/contest/1257/problem/E 题意:有三个集合集合里面的数字可以随意变换位置,不同集合的数字,如从第一个A集合取一个数字到B集合那操作数+ ...
- 思维+并查集 hdu5652
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...
- Gym - 101243F Vitamins(思维+并查集)
题意 有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’ 题解 如果1<2<3,只要找到2就能确定1和3的颜色 如果2=4,只要确 ...
- BNU 4096 逆序 思维题
https://www.bnuoj.com/v3/problem_show.php?pid=4096 对于一个序列a,我们定义它的逆序数为满足a[i]>a[j]且i<j的有序对<i, ...
- 牛客网多校第4场 J Hash Function 【思维+并查集建边】
题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...
- codeforces 1013B 【思维+并查集建边】
题目链接:戳这里 转自:参考博客 题意:给一个n*m的矩阵,放入q个点,这q个点之间的关系是,若已知这样三个点(x1,y1),(x2,y1),(x1,y2),可以在(x2,y2)处生成一个新的点,对于 ...
- CodeForces - 1243D (思维+并查集)
题意 https://vjudge.net/problem/CodeForces-1243D 有一张完全图,n个节点 有m条边的边权为1,其余的都为0 这m条边会给你 问你这张图的最小生成树的权值 思 ...
- UVALive 6910 Cutting Tree(并查集应用)
总体来说,这个题给的时间比较长,样例也是比较弱的,别的方法也能做出来. 我第一次使用的是不合并路径的并查集,几乎是一种暴力,花了600多MS,感觉还是不太好的,发现AC的人很多都在300MS之内的过得 ...
- [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)
对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...
随机推荐
- HDU3681 Prison Break
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 【BZOJ】1176: [Balkan2007]Mokia
[题意]n*n的矩阵,初始值为0(题面有误),m次操作,增加一个格子的权值,或查询子矩阵和.n<=2*10^6.(m应该较题面所述偏大). [算法]CDQ分治(算法知识见数据结构) [题解]三维 ...
- HDU 2319 Card Trick (模拟)
题目链接 Problem Description The magician shuffles a small pack of cards, holds it face down and perform ...
- Redis数据类型之散列(hash)
1. 什么是散列 散列类似于一个字典,是一个<K, V>对的集合,不过这个key和value都只能是字符串类型的,不能嵌套,可以看做Java中的Map<String, String& ...
- 23、Xpath
1.什么是Xpath?1.XPath即为XMLPath的简称,它是一种用来确定XML文档中某部分位置的语言.2.HTML可以看做是XML的一种实现,所以selenium用户可以使用这种强大的语言在we ...
- spring-boot-资源处理
WebMvcConfigurerAdapter 使用 1.实现 HandlerInterceptorAdapter 2.添加拦截器 重写WebMvcConfigurerAdapter中的addInte ...
- docker 升级后,配置 idea 连接 docker
[root@A01-R02-I188-87 ~]# docker version Client: Version: 18.06.1-ce API version: 1.24 Go version: g ...
- Mysql储存过程7: case
#用在储存过程中: create procedure k() begin declare number int; )); case number then select '>0'; else s ...
- rust 入门
hello rust fn main() { println!("Hello, world!"); } 从hello world入手,rust的语法是比较简洁. 在mac os中, ...
- IDEA配置toString方法
1.toString JSON带父类toString public java.lang.String toString() { final java.lang.StringBuilder sb = n ...