[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.尤其当数据量特别大的时候 学 ...
随机推荐
- C++对象模型--总结
http://c.biancheng.net/cpp/biancheng/view/239.html 博客园有关C++内存布局,对象模型的文章. Effective C++ 绝不重写non-virtu ...
- html 浮动元素
在CSS布局中分为内联元素(display:inline)和块状元素(display:block),块状元素默认会占据一行,可设置高度宽度以及边距,而内联元素不会也不能设置.常见的内联元素有:a.sp ...
- Android 开发笔记“Application 理解”
Android 中Application类用法 1. Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时 ...
- C#读取网页
public bool getweb(string strURL,out string buf) { buf=""; try { //Uri url=new Uri(strURL, ...
- web应用中Spring ApplicationContext的动态更新
在web应用中时常需要修改配置,并动态的重新加载ApplicationContext.比如,设置和切换数据库.以下给出一个方法,并通过代码验证可行性. 方法的基本思路是,为WebApplication ...
- JS实现日历控件选择后自动填充
最近在做人事档案的项目,在做项目的初期对B/S这块不是很熟悉,感觉信心不是很强,随着和师哥同组人员的交流后发现,调试程序越来越好了,现在信心是倍增,只要自己自己踏实的去研究.理解代码慢慢的效果就出来了 ...
- .net Windows服务程序和安装程序制作图解
最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自 ...
- SharePoint 2010以其他用户身份登录的弹出代码
在SharePoint 2010平台中,可以在当前用户登录系统的情况下使用其他用户身份登录,以达到在同一浏览器中切换用户身份的目的. 每个用户登录SharePoint系统之后都会在系统右上角将用户的名 ...
- MVC3.0部署问题小结
环境:MVC3.0,IIS7 Mvc3.0的部署除像正常部署aspx程序一样外,另外还需要注意的几点:1. 安装MVC3.0 确保服务器上安装了MVC3.0,默认版本是“3.0.20105.0” 2. ...
- 解决:Visual Assist X 不支持HTML、Javascript等提示
Visual Assist X 安装后,不能进行javascript hmtl提示,只有回到老版本才行.这个问题折腾了老久,才给解决了. 记录下来,以便于网友和自己使用. 问题原因: Visual A ...