ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖。问最后能够有几个圆被看见。。
。
对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这个点,能盖住这个点的最上面的圆一定是可见的
Viva Confetti
Time Limit: 2 Seconds Memory Limit: 65536 KB
Do you know confetti?
They are small discs of colored paper, and people throw them around during parties or festivals. Since people throw lots of confetti, they may end up stacked
one on another, so there may be hidden ones underneath.
A handful of various sized confetti have been dropped on a table. Given their positions and sizes, can you tell us how many of them you can see?
The following figure represents the disc configuration for the first sample input, where the bottom disc is still visible.

Input
The input is composed of a number of configurations of the following form.
n
x1 y1 r1
x2 y2 r2
. . .
xn yn rn
The first line in a configuration is the number of discs in the configuration (a positive integer not more than 100), followed by one line descriptions of each disc: coordinates of its
center and radius, expressed as real numbers in the decimal notation, with up to 12 digits after the decimal point. The imprecision margin is 5*10^-13. That is, it is guaranteed that variations of less than 5*10^-13 on input values do not change which discs
are visible. Coordinates of all points contained in discs are between -10 and 10.
Confetti are listed in their stacking order, x1 y1 r1 being the bottom one and xn yn rn the top one. You are observing from the top.
The end of the input is marked by a zero on a single line.
Output
For each configuration you should output the number of visible confetti on a single line.
Sample Input
3
0 0 0.5
-0.9 0 1.00000000001
0.9 9 1.00000000001
5
0 1 0.5
1 1 1.00000000001
0 2 1.00000000001
-1 1 1.00000000001
0 -0.00001 1.00000000001
5
0 1 0.5
1 1 1.00000000001
0 2 1.00000000001
-1 1 1.00000000001
0 0 1.00000000001
2
0 0 1.0000001
0 0 1
2
0 0 1
0.00000001 0 1
0
Sample Output
3
5
4
2
2
Source: Asia 2002, Kanazawa (Japan)
Submit
problemId=696" style="color:blue; text-decoration:none">Status
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> using namespace std; const double eps=5*(1e-13);
const double pi=acos(-1.0); int n; struct Point
{
double x,y;
Point(){}
Point(double _x,double _y):x(_x),y(_y){}
}; struct Circle
{
Point c;
double r;
Circle(){}
Circle(Point _c,double _r):c(_c),r(_r){}
Point point(double x) {return Point(c.x+cos(x)*r,c.y+sin(x)*r);}
}; double normal(double x)
{
return x-floor(x/(2*pi))*2*pi;
} double dcmp(double x)
{
if(fabs(x)<=eps) return 0;
return (x<0)? -1:1;
} double DIST(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} Circle C[200];
double a[1000];
int tot=0;
bool flag[110]; void check(Point x)
{
for(int i=n-1;i>=0;i--)
{
double d=DIST(x,C[i].c);
if(dcmp(d-C[i].r)<0)
{
flag[i]=true; break;
}
}
} int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++)
{
double x,y,z;
scanf("%lf%lf%lf",&x,&y,&z);
C[i]=Circle(Point(x,y),z);
} for(int i=0;i<n;i++)
{
tot=0;
for(int j=0;j<n;j++)
{
if(i==j) continue;
double dist=DIST(C[i].c,C[j].c);
double ri=C[i].r,rj=C[j].r;
if(dcmp(dist-ri-rj)>=0||dcmp(dist-fabs(ri-rj))<=0) continue;
double t=atan2(C[j].c.y-C[i].c.y,C[j].c.x-C[i].c.x);
double dt= acos((ri*ri+dist*dist-rj*rj)/(2.*ri*dist));
a[tot++]=normal(t+dt); a[tot++]=normal(t-dt);
}
a[tot++]=0;a[tot++]=2*pi;
sort(a,a+tot);
tot=unique(a,a+tot)-a;
for(int j=0;j<tot-1;j++)
{
double u=(a[j]+a[j+1])/2;
double r1=C[i].r+eps,r2=C[i].r-eps;
Point p1=Point(C[i].c.x+r1*cos(u),C[i].c.y+r1*sin(u));
Point p2=Point(C[i].c.x+r2*cos(u),C[i].c.y+r2*sin(u));
check(p1); check(p2);
}
}
int ans=0;
for(int i=0;i<n;i++)
if(flag[i]) ans++;
printf("%d\n",ans);
}
return 0;
}
ZOJ 1696 Viva Confetti 计算几何的更多相关文章
- poj1418 Viva Confetti 判断圆是否可见
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Viva Confetti Time Limit: 1000MS Memory ...
- poj 1418 Viva Confetti
Viva Confetti Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1025 Accepted: 422 Desc ...
- uva 2572 Viva Confetti
思路: 小圆面是由小圆弧围成.那么找出每条小圆弧,如果小圆弧,在小圆弧中点上下左右进行微小位移的所得的点一定在一个小圆面内. 找到最后覆盖这个小点的圆一定是可见的. 圆上的点按照相邻依次排序的关键量为 ...
- uva 1308 - Viva Confetti
这个题目的方法是将圆盘分成一个个圆环,然后判断这些圆环是否被上面的圆覆盖: 如果这个圆的圆周上的圆弧都被上面的覆盖,暂时把它标记为不可见: 然后如果他的头上有个圆,他有个圆弧可见,那么他自己本身可见, ...
- UVaLive2572 poj1418 UVa1308 Viva Confetti
一次放下n个圆 问最终可见的圆的数量 应该是比较经典的问题吧 考虑一个圆与其他每个圆的交点O(n)个 将其割成了O(n)条弧 那么看每条弧的中点 分别向内向外调动eps这个点 则最上面的覆盖这个点的圆 ...
- ZOJ 2675 Little Mammoth(计算几何)
圆形与矩形截面的面积 三角仍然可以做到这一点 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- zoj 3537 区间dp+计算几何
题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...
- LA2572 Viva Confetti
题意 PDF 分析 两两圆求交点,对每个圆弧按半径抖动. 时间复杂度\(O(T n^2)\) 代码 #include<iostream> #include<cstdio> #i ...
- [GodLove]Wine93 Tarining Round #9
比赛链接: http://vjudge.net/contest/view.action?cid=48069#overview 题目来源: lrj训练指南---二维几何计算 ID Title Pro ...
随机推荐
- mysql安装出错cannot create windows service for mysql.error:0
配置时最后一步出现不能启动mysql 解决成功的办法:[MySQL] Could not start the service MySQL 解决方法 安装mysql 5.1.33,在运行Server I ...
- 2015.04.21,外语,读书笔记-《Word Power Made Easy》 12 “如何奉承朋友” SESSION 32
TEASER PREVIEW 如何描述这些人: 很友好.容易相处的人: 不知疲倦的人: 简单.直率..aboveboard([ə'bʌv'bɔ:d] adv. 光明正大地, 率直地 adj. 光明正大 ...
- 什么是BOM头(字节顺序标记(ByteOrderMark))
在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑ut ...
- 17. Letter Combinations of a Phone Number[M]电话号码的字母组合
题目 Given a string containing digits from 2-9 inclusive, return all possible letter combinations that ...
- POJ 1466 最大独立点集
思路:匈牙利 n-ans/2; // by SiriusRen #include <cstdio> #include <cstring> #define N 505 using ...
- ORA-16019 和 ORA-16018 错误的处理方法(转)
一. ORA-16019 和 ORA-16018 错误产生描述 同事在修改归档目录,一不小心把参数设置错误了, 他设置的是log_archive_dest参数. 这个参数和默认log_archive_ ...
- vue中slot组件的使用
插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. Slot 是在组件模板中设置的用于在父组件中 ...
- (转载) Android Studio你不知道的调试技巧
Android Studio你不知道的调试技巧 标签: android studio 2015-12-29 16:05 2514人阅读 评论(0) 收藏 举报 分类: android(74) ...
- 如何使用pgpool failover_stream.sh自己控制选择指定的master节点
集群架构: h236:master h237:standby sync h238:standby sync h239:stadnby async h240:standby async h241:sta ...
- input输入框只允许输入数字
/* input输入框只允许输入数字*/ <input type="text" onkeypress="keyPress()" > function ...