POJ 2932 Coneology(扫描线)
【题目链接】 http://poj.org/problem?id=2932
【题目大意】
给出N个两两没有公共点的圆,求所有不包含于其它圆内部的圆
【题解】
我们计算出所有点在圆心所有y位置的x值,
由于两两没有公共点,所以当我们对所有的x坐标进行扫描时,只要扫描相邻的x,
判定扫描到的圆和与其x相邻的圆是否是圆包含关系就可以判断一个圆的位置
扫描到左端点时,如果圆其被包含,则什么都不做,否则,将这个圆加入set中,
当扫描到右端点时,如果圆被包含,则什么都不做,否则将圆从set中去除。
【代码】
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
const int MAX_N=40010;
int N;
double x[MAX_N],y[MAX_N],r[MAX_N];
bool inside(int i,int j){
double dx=x[i]-x[j],dy=y[i]-y[j];
return dx*dx+dy*dy<=r[j]*r[j];
}
void solve(){
vector<pair<double,int> >events;
for(int i=0;i<N;i++){
events.push_back(make_pair(x[i]-r[i],i));
events.push_back(make_pair(x[i]+r[i],i+N));
}
sort(events.begin(),events.end());
set<pair<double,int> >outers;
vector<int> res;
for(int i=0;i<events.size();i++){
int id=events[i].second%N;
if(events[i].second<N){
set<pair<double,int> >::iterator it=outers.lower_bound(make_pair(y[id],id));
if(it!=outers.end()&&inside(id,it->second))continue;
if(it!=outers.begin()&&inside(id,(--it)->second))continue;
res.push_back(id);
outers.insert(make_pair(y[id],id));
}else outers.erase(make_pair(y[id],id));
}sort(res.begin(),res.end());
printf("%d\n",res.size());
for(int i=0;i<res.size();i++){
printf("%d%c",res[i]+1,i+1==res.size()?'\n':' ');
}
}
void init(){
for(int i=0;i<N;i++)scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
}
int main(){
while(~scanf("%d",&N)){
init();
solve();
}return 0;
}
POJ 2932 Coneology(扫描线)的更多相关文章
- POJ 2932 圆扫描线
求n个圆中没有被包含的圆.模仿扫描线从左往右扫,到左边界此时如有3个交点,则有3种情况,以此判定该圆是否被离它最近的圆包含,而交点和最近的圆可以用以y高度排序的Set来维护.因此每次到左边界插入该圆, ...
- poj 2932 Coneology(扫描线+set)
Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3574 Accepted: 680 Descript ...
- poj 2932 Coneology (扫描线)
题意 平面上有N个两两不相交的圆,求全部最外层的,即不被其它圆包括的圆的个数并输出 思路 挑战程序竞赛P259页 代码 /* ************************************* ...
- POJ 2932 Coneology计算最外层圆个数
平面上有n个两两没有公共点的圆,i号圆的圆心在(xi,yi),半径为ri,编号从1开始.求所有最外层的,即不包含于其他圆内部的圆.输出符合要求的圆的个数和编号.n<=40000. (注意此题无相 ...
- TTTTTTTTTTTTTTT poj 2932 Coneology 平面扫描+STL
题目链接 题意:有n个圆,圆之间不存在相交关系,求有几个不被其他任何圆包含的圆,并输出圆的编号: #include <iostream> #include <cstdio> # ...
- Coneology(POJ 2932)
原题如下: Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4937 Accepted: 1086 D ...
- POJ 1151 Atlantis (扫描线+线段树)
题目链接:http://poj.org/problem?id=1151 题意是平面上给你n个矩形,让你求矩形的面积并. 首先学一下什么是扫描线:http://www.cnblogs.com/scau2 ...
- N - Picture - poj 1177(扫描线求周长)
题意:求周长的,把矩形先进行融合后的周长,包括内周长 分析:刚看的时候感觉会跟棘手,让人无从下手,不过学过扫描线之后相信就很简单了吧(扫描线的模板- -),还是不说了,下面是一精确图,可以拿来调试数据 ...
- poj2932 Coneology (扫描线)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Coneology Time Limit: 5000MS Memory Lim ...
随机推荐
- HDU 5666 快速乘
Segment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- istringstream()函数的用法
istringstream()函数的用法 头文件:#include 功能:将一个含有多个空格的字符串分割开来 eg:
- 【uva11468-Substring】AC自动机+dp
http://acm.hust.edu.cn/vjudge/problem/31655 题意:给定k个模板串,n个字符以及选择它的概率pro[i],要构造一个长度问L的字符串s,问s不包含任意一个模板 ...
- [POJ3237]Tree解题报告|树链剖分|边剖
关于边剖 之前做的大多是点剖,其实转换到边剖非常简单. 我的做法是每个点的点权记录其到父亲节点的边的边权. 只要solve的时候不要把最上面的点记录在内就可以了. Tree Description Y ...
- django返回二进制图片
@login_required def down_img(request, path): content = Storage().download(path) from django.http imp ...
- 转: JAVA_SWT常用事件, 和方法
转自: http://blog.csdn.net/lyq19870515/article/details/9450275 获取焦点事件: text.addListener(SWT.FocusIn, n ...
- CocoaPods详解之----使用篇
http://blog.csdn.net/meegomeego/article/details/24005567 作者:wangzz 原文地址:http://blog.csdn.net/wzzvict ...
- js中给easyui的一列添加按钮
$("#totalTb").datagrid({ columns: [[ { field: 'ENTITY_ACTNAME', title: '活动名 ...
- 获取struts迭代list在页面显示的数据
js代码: function modifyPactMoney(){ var table=$("#pactfee"); var trs=table.find("tr&quo ...
- Newtonsoft.Json 序列化和反序列化 以及时间格式 2
一.JSON使用JsonPropertyAttribute重命名属性名 1.先创建一个Movie对象,然后在其属性上添加JsonProperty,并指定重命名的名称.注意:属性Name和Directo ...