[POJ 2588]--Snakes(并查集)
题目链接:http://poj.org/problem?id=2588
Snakes
Description Buffalo Bill wishes to cross a 1000x1000 square field. A number of snakes are on the field at various positions, and each snake can strike a particular distance in any direction. Can Bill make the trip without being bitten?
Input Assume that the southwest corner of the field is at (0,0) and the northwest corner at (0,1000). The input consists of a line containing n <= 1000, the number of snakes. A line follows for each snake, containing three real numbers: the (x,y) location of the snake and its strike distance. The snake will bite anything that passes closer than this distance from its location.
Output Bill must enter the field somewhere between the southwest and northwest corner and must leave somewhere between the southeast and northeast corners.
If Bill can complete the trip, give coordinates at which he may enter and leave the field. If Bill may enter and leave at several places, give the most northerly. If there is no such pair of positions, print "Bill will be bitten." Sample Input 3 Sample Output Bill enters at (0.00, 1000.00) and leaves at (1000.00, 800.00). Source |
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 1005 /*-------------上下左右边界判断-------------*/
struct UpDown{
double x, y, area;
}snack[maxn];
struct LeftRight{
double up, down;
int i;
}le[maxn], ri[maxn]; int father[maxn], map[maxn][maxn]; //----------检查当前出入最高点是否可用--------------------
bool check(LeftRight *p, double x, int n){
for (int i = ; i < n; i++){
if (p[i].up>x&&p[i].down < x)
return false;
}
return true;
} //-------------并查集判断构造的点(包括上下边界)是否连通-------------------
int getf(int x){
return father[x] != x ? father[x] = getf(father[x]) : x;
} int main()
{
int n, i, j;
while (cin >> n){
for (i = ; i <= n + ; i++)
father[i] = i;
int L = , R = ;
memset(map, , sizeof(map));
for (i = ; i <= n; i++){
cin >> snack[i].x >> snack[i].y >> snack[i].area; //-----------建立上下关系---------------
if (snack[i].y + snack[i].area > )
map[][i] = map[i][] = ;
if (snack[i].y - snack[i].area < )
map[n + ][i] = map[i][n + ] = ; //---------建立左右关系------------------
if (snack[i].x - snack[i].area < ){
le[L].up = snack[i].y + sqrt(pow(snack[i].area, ) - pow(snack[i].x, ));
le[L].down = snack[i].y - sqrt(pow(snack[i].area, ) - pow(snack[i].x, ));
le[L++].i = i;
}
if (snack[i].x + snack[i].area >){
ri[R].up = snack[i].y + sqrt(pow(snack[i].area, ) - pow(( - snack[i].x), ));
ri[R].down = snack[i].y - sqrt(pow(snack[i].area, ) - pow(( - snack[i].x), ));
ri[R++].i = i;
}
} //-------------通过圆心判断各区域相交情况-------------------
for (i = ; i < n; i++)
for (j = i + ; j <= n; j++){
if (snack[i].area + snack[j].area>sqrt(pow((snack[i].x - snack[j].x), ) + pow((snack[i].y - snack[j].y), )))
map[i][j] = map[j][i] = ;
} //-----------并查集处理------------------
for (i = ; i <= n; i++)
for (j = i + ; j <= n + ; j++){
if (map[i][j]){
int x = getf(i), y = getf(j);
if (x != y)
father[y] = x;
}
} if (getf(n + ) == getf())
cout << "Bill will be bitten." << endl; else{
double Lflag = -, Rflag = -, Lup = , Ldown = , Rup = , Rdown = ; //-----------找到最高可用左边界------------------------
for (i = ; i < L; i++){
if (getf(le[i].i) == getf() && le[i].down < Lup)
Lup = le[i].down;
if (getf(le[i].i) == getf(n + ) && le[i].up >Ldown)
Ldown = le[i].up;
} if (check(le, , L) && Lup == )
Lflag = ; for (i = ; i < L; i++){
if (le[i].up <= Lup&&le[i].up >= Ldown&&check(le, le[i].up, L) && Lflag < le[i].up)
Lflag = le[i].up;
if (le[i].down <= Lup&&le[i].down >= Ldown&&check(le, le[i].down, L) && Lflag < le[i].down)
Lflag = le[i].down;
}
//---------------------------------------------------------------------- //--------------------------===右边界处理-----------------------
for (i = ; i < R; i++){
if (getf(ri[i].i) == getf() && ri[i].down < Rup)
Rup = ri[i].down;
if (getf(ri[i].i) == getf(n + ) && ri[i].up >Rdown)
Rdown = ri[i].up;
}
if (check(ri, , R) && Rup == )
Rflag = ;
for (i = ; i < R; i++){
if (ri[i].up <= Rup&&ri[i].up >= Rdown&&check(ri, ri[i].up, R) && Rflag < ri[i].up)
Rflag = ri[i].up;
if (ri[i].down <= Rup&&ri[i].down >= Rdown&&check(ri, ri[i].down, R) && Rflag < ri[i].down)
Rflag = ri[i].down;
}
if (L == )
Lflag = ;
if (R == )
Rflag = ;
if (Rflag < || Lflag < )
cout << "Bill will be bitten." << endl;
else
printf("Bill enters at (0.00, %.2lf) and leaves at (1000.00, %.2lf).\n", Lflag, Rflag);
}
}
return ;
}
[POJ 2588]--Snakes(并查集)的更多相关文章
- poj 2524 (并查集)
http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...
- [POJ 2588] Snakes
同swustoj 8 Snakes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1015 Accepted: 341 ...
- poj 1456 Supermarket - 并查集 - 贪心
题目传送门 传送点I 传送点II 题目大意 有$n$个商品可以销售.每个商品销售会获得一个利润,但也有一个时间限制.每个商品需要1天的时间销售,一天也只能销售一件商品.问最大获利. 考虑将出售每个物品 ...
- poj 2492(关系并查集) 同性恋
题目;http://poj.org/problem?id=2492 卧槽很前卫的题意啊,感觉节操都碎了, t组测试数据,然后n,m,n条虫子,然后m行,每行两个数代表a和b有性行为(默认既然能这样就代 ...
- poj 1182 (关系并查集) 食物链
题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...
- Poj(1182),种类并查集
题目链接:http://poj.org/problem?id=1182 再次熟练种类并查集,又积累点经验,和技巧,rank 0 2 1 先计算father[x] ,再更新rank[x]; #inclu ...
- Poj(1703),种类并查集
题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- poj 2513 欧拉回路+并查集推断是否联通+Trie树
http://poj.org/problem? id=2513 最初看到 第一感觉---map 一看250000的数据量 果断放弃 然后记得曾经看过.trie取代map.尤其当数据量特别大的时候 学 ...
随机推荐
- Hadoop MultipleOutputs 结果输出到多个文件夹 出现数据不全,部分文件为空
如题:出现下图中的情况(设置reduceNum=5) 感觉很奇怪,排除了很久,终于发现是一个第二次犯的错误:丢了这句 this.mOutputs.close(); 加上这句,一切恢复正常!
- Python之路Day2
-->the start 养成好习惯,每次上课的内容都要写好笔记. 第二天内容主要是熟悉int.long.float.str.list.dict.tuple这几个类的内建方法. 对于Python ...
- BeanUtils复制属性
package xiao; public class User2 { private String name; private String password; public String getNa ...
- 国内外主流BI厂商对比
BI(Business Intelligence),即商业智能或者商务智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业做出明智的业务经营决 ...
- document.createElement在IE和Firefox下的差异
IE有3种方式都可以创建一个元素: 1 document.createElement("<input type=text>") 2 document.createEle ...
- Python生成随机数的方法
这篇文章主要介绍了Python生成随机数的方法,有需要的朋友可以参考一下 如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与 ...
- js中this的深入研究
this对象是函数在运行时由调用函数的对象决定的: 1.在全局对象中运行函数时,this等于window 2.当函数被作为某个对象的方法调用时, this等于那个对象. 需要注意的几点: 声明函数里的 ...
- [译]Stairway to Integration Services Level 11 - 日志配置
介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...
- C# Coding & Naming Conventions
Reference document https://msdn.microsoft.com/en-us/library/ff926074.aspx https://msdn.microsoft.com ...
- IOS开发:UIAlertView使用
链接地址:http://www.2cto.com/kf/201307/231841.html UIAlertView是什么就不介绍了 1.基本用法 1 UIAlertView *view = [[UI ...