题目大意:

平面上有n个两两不相交的圆,给定圆的圆心(x,y)和半径 r

求所有最外层的 即 不包含于其他圆内部的圆

挑战258页 平面扫描

记录所有圆的左端和右端 排序后 逐一扫描

将到当前圆为止的最外层的圆存入数组

当遇到一个圆的左端

判断 这个圆 是否被 离它最近的上下的两个已存入的最外层的圆 包含

若被包含 则跳过该圆

若未被包含 说明其是一个最外层的圆 存入数组

这里不会有 它包含上下其中某个圆 的情况出现

因为包含某个圆 那么 该圆的左端 必定位于 被包含圆的左端的左边

但是平面扫描限制了 该圆的左端必定位于 已知的最外层的圆的左端的右边

#include <cstdio>
#include <algorithm>
#include <string.h>
#include <set>
#include <vector>
#define F first
#define S second
#define P pair<double,int>
using namespace std;
const int N=+;
double x[N],y[N],r[N];
/*圆i是否包含在圆j内
dx*dx+dy*dy 两圆圆心距 的平方
若小于圆j的半径的平方
则i包含于j内
这里的前提是所有圆两两不相交
*/
bool inside(int i,int j)
{
double dx=x[j]-x[i], dy=y[j]-y[i];
return dx*dx+dy*dy<=r[j]*r[j];
}
int main()
{
vector <P> vec;
int n; scanf("%d",&n);
for(int i=;i<n;i++) {
scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
vec.push_back(P(x[i]-r[i],i)); // 左端
vec.push_back(P(x[i]+r[i],i+n)); // 右端 i+n便于和左端点区别开
}
sort(vec.begin(),vec.end());
set <P> s;
vector <int> ans;
for(int i=;i<vec.size();i++) {
int id=vec[i].S;
if(id<n) { // 左端点
set <P> ::iterator it=s.lower_bound(P(y[id],id));
// 找到id上面的圆
if(it!=s.end() && inside(id,it->S)) continue;
// 判断上面的圆有没有包含id
if(it!=s.begin() && inside(id,(--it)->S)) continue;
// 判断下面的圆有没有包含id
ans.push_back(id);
s.insert(P(y[id],id));
}
else s.erase(P(y[id%n],id%n)); // 右端点
// 之后出现的圆不可能于该圆有任何包含关系 将该圆去掉
}
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
for(int i=;i<ans.size();i++)
printf("%d ",ans[i]+);
printf("\n");
return ;
}

POJ 2932 平面扫描 /// 判断圆的包含关系的更多相关文章

  1. POJ 2932 圆扫描线

    求n个圆中没有被包含的圆.模仿扫描线从左往右扫,到左边界此时如有3个交点,则有3种情况,以此判定该圆是否被离它最近的圆包含,而交点和最近的圆可以用以y高度排序的Set来维护.因此每次到左边界插入该圆, ...

  2. A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&判断点在多边形内&判断圆在多边形内)

    题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内.   分析:判断凸多边形可 ...

  3. poj 2932 Coneology(扫描线+set)

    Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3574   Accepted: 680 Descript ...

  4. Coneology(POJ 2932)

    原题如下: Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4937   Accepted: 1086 D ...

  5. 判断圆和矩形是否相交C - Rectangle and Circle

    Description Given a rectangle and a circle in the coordinate system(two edges of the rectangle are p ...

  6. poj 1064 Cable master 判断一个解是否可行 浮点数二分

    poj 1064 Cable master 判断一个解是否可行 浮点数二分 题目链接: http://poj.org/problem?id=1064 思路: 二分答案,floor函数防止四舍五入 代码 ...

  7. HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1221 Rectangle and Circle Time Limit: 2000/1000 MS (J ...

  8. POJ1584 A Round Peg in a Ground Hole 凸包判断 圆和凸包的关系

    POJ1584 题意:给定n条边首尾相连对应的n个点 判断构成的图形是不是凸多边形 然后给一个圆 判断圆是否完全在凸包内(相切也算) 思路:首先运用叉积判断凸多边形 相邻三条边叉积符号相异则必有凹陷 ...

  9. 基于正向扫描的并行区间连接平面扫描算法(IEEE论文)

    作者: Panagiotis Bouros ∗Department of Computer ScienceAarhus University, Denmarkpbour@cs.au.dkNikos M ...

随机推荐

  1. JUC 一 ConcurrentHashMap

    java.util.concurrent ConcurrentHashMap是一个支持并发检索和并发更新的线程安全的HashMap(但不允许空key或value). JDK8以CAS+synchron ...

  2. python 识别验证码自动登陆

    # python 3.5.0 # 通过Chrom浏览器访问发起请求 # 需要对应版本的Chrom和chromdriver # 作者:linyouyi from selenium import webd ...

  3. bzoj 2257 (JSOI 2009) 瓶子与燃料

    Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1<=N& ...

  4. cnn知识点汇总

    关于卷积神经网络的入门基础知识: https://blog.csdn.net/weixin_42451919/article/details/81381294   卷积神经网络的相关公式推导: htt ...

  5. MFC-按行读取TXT数据

    TXT中数据格式如下: 1 23 4 0 4 10 …… 要实现的功能是:定义一个函数,每次调用时从TXT文档中读一个整数 ,赋值给变量.同时,文件位置向下移动一行,以便下次调用时读取下一行的数据. ...

  6. 2、http请求与http响应

    我们在接口测试过程中,可能会用http协议,webservice协议,当然用的较多的还是http协议,webservice协议在此不做过多介绍,我们先了解一下http协议,然后重点介绍http请求与响 ...

  7. C/S通信

    一直在考虑写一个服务端和客户端通信的框架,就现在的需求,打算走http协议. 通信方式打算用Key/Value的形式. 这里面其实还是有很多的问题的,这样的一个通信框架其实是SOA的一部分.其他 但是 ...

  8. java-day03

    判断语句if格式 if(关系表达式){ } if...else格式: if(关系表达式){ }else{ } if...else if格式: if(关系表达式){ }else if(关系表达式){ } ...

  9. API文档管理工具

    系统庞大之后,前后端分离开发,前端调用后端提供的接口,请求协议一般是 HTTP,数据格式一般是 JSON.后台只负责数据的提供和计算,而完全不处理展现逻辑和样式:前端则负责拿到数据,组织数据并展现的工 ...

  10. JS对象 charAt() 方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。

    返回指定位置的字符 charAt() 方法可返回指定位置的字符.返回的字符是长度为 1 的字符串. 语法: stringObject.charAt(index) 参数说明: 注意:1.字符串中第一个字 ...