计算几何:按顺序给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 计算几何的更多相关文章

  1. poj1418 Viva Confetti 判断圆是否可见

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Viva Confetti Time Limit: 1000MS   Memory ...

  2. poj 1418 Viva Confetti

    Viva Confetti Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1025   Accepted: 422 Desc ...

  3. uva 2572 Viva Confetti

    思路: 小圆面是由小圆弧围成.那么找出每条小圆弧,如果小圆弧,在小圆弧中点上下左右进行微小位移的所得的点一定在一个小圆面内. 找到最后覆盖这个小点的圆一定是可见的. 圆上的点按照相邻依次排序的关键量为 ...

  4. uva 1308 - Viva Confetti

    这个题目的方法是将圆盘分成一个个圆环,然后判断这些圆环是否被上面的圆覆盖: 如果这个圆的圆周上的圆弧都被上面的覆盖,暂时把它标记为不可见: 然后如果他的头上有个圆,他有个圆弧可见,那么他自己本身可见, ...

  5. UVaLive2572 poj1418 UVa1308 Viva Confetti

    一次放下n个圆 问最终可见的圆的数量 应该是比较经典的问题吧 考虑一个圆与其他每个圆的交点O(n)个 将其割成了O(n)条弧 那么看每条弧的中点 分别向内向外调动eps这个点 则最上面的覆盖这个点的圆 ...

  6. ZOJ 2675 Little Mammoth(计算几何)

    圆形与矩形截面的面积 三角仍然可以做到这一点 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  7. zoj 3537 区间dp+计算几何

    题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...

  8. LA2572 Viva Confetti

    题意 PDF 分析 两两圆求交点,对每个圆弧按半径抖动. 时间复杂度\(O(T n^2)\) 代码 #include<iostream> #include<cstdio> #i ...

  9. [GodLove]Wine93 Tarining Round #9

    比赛链接: http://vjudge.net/contest/view.action?cid=48069#overview 题目来源: lrj训练指南---二维几何计算   ID Title Pro ...

随机推荐

  1. Gzip压缩优化网站

    网站常使用GZIP压缩算法对网页内容进行压缩,然后传给浏览器,以减小数据传输量,提高响应速度.浏览器接收到GZIP压缩数据后会自动解压并正确显示.GZIP加速常用于解决网速慢的瓶颈. 压缩Filter ...

  2. h5-弹出层layer,提示,顶部横条,

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYkAAAI7CAIAAACWVfAJAAAgAElEQVR4nOy9f1ATWb733z3uOA4kIC ...

  3. HD-ACM算法专攻系列(22)——Max Sum

    问题描述: AC源码: 此题考察动态规划,解题思路:遍历(但有技巧),在于当前i各之和为负数时,直接选择以第i+1个为开头,在于当前i各之和为正数时,第i个可以不用作为开头(因为前i+1个之和一定大于 ...

  4. Fildder 4接口测试工具Post请求方式

  5. Android中的事件分发机制

    Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...

  6. What is the difference between arguments and parameters?

    What is the difference between arguments and parameters? Parameters are defined by the names that ap ...

  7. 查看网站域名IP地址

    运行:CMD 输入: Nslookup 网站地址 示例: Nslookup httpwww.baidu.com 我们是筑梦团队,我们的座右铭是:当提起逐梦的脚步,也请举起筑梦的双手

  8. POJ 3624 Charm Bracelet【01背包】

    解题思路:直接套公式就能做的01背包, for(i=1;i<=n;i++) { for(v=w[i];v<=m;v++) f[i,v]=max(f[i,v],f[i-1,v-w[i]]+d ...

  9. day16 闭包以及装饰器(好东西)

    目录 闭包 装饰器 最基础的装饰器 完善装饰器 有返回值的 有参数的 装饰器模版 语法糖 登录装饰器 可变类型的局部变量可以修改全局变量 三层装饰器 闭包 首先要理解函数对象的概念,其实函数名就相当于 ...

  10. LayUI中select下拉框选中触发事件

    代码: var form = layui.form, layer = layui.layer; // 监听 $(document).ready(function() { // select下拉框选中触 ...