poj 2932 Coneology 扫面线法

题意:

给n个无交点的圆,求这n个圆中不被其它圆包含的圆。

分析:

扫面线法,用二叉树(set+lowerbound方法)维护最外圆的集合。

代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
const int maxN=40012;
double r[maxN],x[maxN],y[maxN];
int n;
vector<pair<double,int> > events;
set<pair<double,int> > outers;
vector<int> res;

bool inside(int i,int j)
{
	double dx=x[i]-x[j],dy=y[i]-y[j],dr=r[i]-r[j];
	return r[i]<=r[j]&&dx*dx+dy*dy<=dr*dr;
}

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i)
		scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
	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());
	for(int i=0;i<events.size();++i){
		int ids=events[i].second%n;
		if(events[i].second<n){
			set<pair<double,int> >::iterator it=outers.lower_bound(make_pair(y[ids],ids));
			if(it!=outers.end()&&inside(ids,it->second)) continue;
			if(it!=outers.begin()&&inside(ids,(--it)->second)) continue;
			res.push_back(ids);
			outers.insert(make_pair(y[ids],ids));
		}else
			outers.erase(make_pair(y[ids],ids));
	}
	sort(res.begin(),res.end());
	printf("%d\n",res.size());
	for(int i=0;i<res.size();++i)
		printf("%d ",res[i]+1);
	return 0;
} 
时间: 2024-10-10 23:03:02

poj 2932 Coneology 扫面线法的相关文章

POJ 2932 Coneology(扫描线)

[题目链接] http://poj.org/problem?id=2932 [题目大意] 给出N个两两没有公共点的圆,求所有不包含于其它圆内部的圆 [题解] 我们计算出所有点在圆心所有y位置的x值, 由于两两没有公共点,所以当我们对所有的x坐标进行扫描时,只要扫描相邻的x, 判定扫描到的圆和与其x相邻的圆是否是圆包含关系就可以判断一个圆的位置 扫描到左端点时,如果圆其被包含,则什么都不做,否则,将这个圆加入set中, 当扫描到右端点时,如果圆被包含,则什么都不做,否则将圆从set中去除. [代码

POJ 2932 Coneology (平面扫描)

Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3713   Accepted: 720 Description A student named Round Square loved to play with cones. He would arrange cones with different base radii arbitrarily on the floor and would admire

poj 2932 Coneology(扫描线+set)

Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3574   Accepted: 680 Description A student named Round Square loved to play with cones. He would arrange cones with different base radii arbitrarily on the floor and would admire

POJ 2932 Coneology计算最外层圆个数

平面上有n个两两没有公共点的圆,i号圆的圆心在(xi,yi),半径为ri,编号从1开始.求所有最外层的,即不包含于其他圆内部的圆.输出符合要求的圆的个数和编号.n<=40000. (注意此题无相交相切!!!)工具:扫描线+set 中心思想:边界分左右端点,如图,当扫描线与k号圆左端点相切,之前用set维护一个y纵坐标的二叉树,那我们在二叉树中查找离k号圆纵坐标最近的上下两个圆(A,B),让k与A,B判是否内含即可,为什么是AB?假设有C点(离k远一些)包含k,但A不包含k,那么一定有A,C相交,

poj 2932 Coneology (扫描线)

题意 平面上有N个两两不相交的圆,求全部最外层的,即不被其它圆包括的圆的个数并输出 思路 挑战程序竞赛P259页 代码 /* ********************************************** Auther: xueaohui Created Time: 2015-7-25 16:56:13 File Name : poj2932.cpp *********************************************** */ #include <iostr

BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) + 1 (假如(i, j)和右边和下边不冲突) 第二问就是经典的悬线法解决最大子矩阵了, 维护悬线H[i][j], 左边右边延伸的最长距离.先一行一行求出这一行的L, R, 然后再从上往下扫, 维护H, L, R 写完我才发现我脑残了...最大的正方形一定是在最大子矩阵里面啊...所以其实不用dp.

Codevs 1159 最大全0子矩阵 悬线法!!!!

1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多. 输入描述 Input Description 输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开. 输出描述 Output Description 输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数.

中点画线法画圆

中点画线法已经在画直线的时候详细讲过了,画圆时我们也可以用这种方法.画一个圆心为坐标原点的1/4圆,然后对其进行简单几何变换,平移对称,就可以得到任意圆. 类似的用中点画线法,从(0,r)点开始,每次要么向右走,要么向右下走,直到x==y,即到达四分之一圆处: (1)当d<0时,中点在圆内,则取正右方的点,(x+1,y+0.5),此时d=d+2*x+3; (2) 当d>=0时,中点在圆外,则取右下方的点,(x+1,y-1),此时d=d+2*(x-y)+5; (3) d0=1-r,即点(0,r)

BZOJ 3039 玉蟾宫 悬线法

题目大意:给出一张地图,求出这张地图中最大的子矩阵,使得这个子矩阵不包含字母'R'. 思路:简单的悬线法求最大子矩阵,还是不带权值的,很好求.好久没写悬线了,复习一下. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1010 using namespace std; int m,n; bool map[MAX][M