n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并。

注意……精度……最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超过2PI一点点,使答案为负。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define EPS 0.000000001
#define INF 1000000.0
int n;
const double PI=acos(-1.0);
double rs[1001],xs[1001],ys[1001],ans;
struct Seg
{
double l,r;
Seg(){}
Seg(const double &L,const double &R){l=L; r=R;}
}q[10001];
bool cmp(const Seg &a,const Seg &b)
{
return fabs(a.l-b.l)<EPS ? a.r<b.r : a.l<b.l;
}
double sqr(const double &x)
{
return x*x;
}
double dis(double x1,double y1,double x2,double y2)
{
return sqrt(sqr(x1-x2)+sqr(y1-y2));
}
int main()
{
// freopen("bzoj1043.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lf%lf%lf",&rs[i],&xs[i],&ys[i]);
for(int i=1;i<=n;++i)
{
int e=0;
double Lef=2.0*PI;
for(int j=i+1;j<=n;++j)
{
double d=dis(xs[i],ys[i],xs[j],ys[j]);
if(d+rs[i]-rs[j]<EPS)
{
Lef=0.0;
break;
}
else if(d+rs[j]-rs[i]<EPS || rs[i]+rs[j]-d<-EPS)
continue;
// double see=(sqr(d)+sqr(rs[i])-sqr(rs[j]))*0.5/d/rs[i];
double jiao2=acos((sqr(d)+sqr(rs[i])-sqr(rs[j]))*0.5/d/rs[i]);
double jiao1=atan2(ys[j]-ys[i],xs[j]-xs[i]);
if(jiao1<-EPS)
jiao1+=(2.0*PI);
if(jiao1-jiao2<-EPS)
{
q[++e]=Seg(0.0,jiao1+jiao2);
q[++e]=Seg(jiao1-jiao2+2.0*PI,2.0*PI);
}
else if(jiao1+jiao2-2.0*PI>EPS)
{
q[++e]=Seg(jiao1-jiao2,2.0*PI);
q[++e]=Seg(0.0,jiao1+jiao2-2.0*PI);
}
else
q[++e]=Seg(jiao1-jiao2,jiao1+jiao2);
}
// for(int j=e;j;--j)
// {
// bool fl=0;
// for(int k=j-1;k;--k)
// if(!(q[j].l-q[k].r>EPS||q[k].l-q[j].r>EPS))
// {
// q[k].l=min(q[j].l,q[k].l);
// q[k].r=max(q[j].r,q[k].r);
// fl=1;
// break;
// }
// if(!fl)
// Lef-=(q[j].r-q[j].l);
// }
Seg now=Seg(INF,INF);
sort(q+1,q+e+1,cmp);
for(int j=1;j<=e;++j)
if(j==e || q[j+1].l-q[j].l>EPS)
{
if(fabs(now.l-INF)<EPS) now=q[j];
else
{
if(q[j].l-now.r<EPS) now.r=max(now.r,q[j].r);
else
{
Lef-=(now.r-now.l);
now=q[j];
}
}
}
if(fabs(now.l-INF)>=EPS)
Lef-=(now.r-now.l);
if(Lef>EPS)
ans+=(Lef*rs[i]);
}
printf("%.3lf\n",ans);
return 0;
}

【计算几何】bzoj1043 [HAOI2008]下落的圆盘的更多相关文章

  1. bzoj1043[HAOI2008]下落的圆盘 计算几何

    1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1598  Solved: 676[Submit][Stat ...

  2. bzoj1043 [HAOI2008]下落的圆盘

    Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input 第一行为1个整数n,N<=1000 ...

  3. BZOJ-1043 [HAOI2008]下落的圆盘

    几何题... 先把所有圆储存起来,然后对于每个圆我们求得之后放下的圆挡住了的部分,求个并集,并把没被挡到的周长加进答案. #include <cstdlib> #include <c ...

  4. 【BZOJ1043】[HAOI2008]下落的圆盘 几何

    [BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  ...

  5. 【bzoj1043】下落的圆盘

    [bzoj1043]下落的圆盘 题意 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. \(1\leq n\leq 1000\ ...

  6. 【BZOJ1043】下落的圆盘 [计算几何]

    下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可 ...

  7. luogu P2510 [HAOI2008]下落的圆盘

    LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...

  8. 【bzoj1043】[HAOI2008]下落的圆盘 计算几何

    题目描述 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. 输入 第一行为1个整数n,N<=1000接下来n行每行3个实 ...

  9. BZOJ 1043 HAOI2008 下落的圆盘 计算几何

    题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后 ...

随机推荐

  1. UVALive - 4513 Stammering Aliens ——(hash+二分 || 后缀数组加二分)

    题意:找一个出现了m次的最长子串,以及这时的最右的位置. hash的话代码还是比较好写的,,但是时间比SA多很多.. #include <stdio.h> #include <alg ...

  2. Linux课程实践四:ELF文件格式分析

    一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...

  3. JavaScript 对象、DOM对象、jquery对象的区别、转换详解

    一.JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 访问对象的属性: [javascrip ...

  4. python第十九天-----Django进阶

    1.机智的小django为我你们提供了快捷的表单验证! from django.shortcuts import render, HttpResponse,redirect from django i ...

  5. Spring MVC @Transactional注解方式事务失效的解决办法

    在springMVC类上绑定@Transactional的注解,但是访问数据库时,总是报 can't localtion to current JTA Transactional. 后来发现sprin ...

  6. jquery获取所选元素的outerHTML

    大家都知道原生js可以获取匹配元素的内部html和外部html,内部是innerHTML,外部是outerHTML,原生js的dom对象是存在这两个属性的. 如果用jQuery如何获取匹配元素(包括自 ...

  7. MySql密码忘记解决方法

    1.先杀掉mysqld-nt.exe 进程,有很多种方法,最简单是在CMD里输入net stop mysql 2.CMD路径切换到MySQL的安装目录下的bin里 输入mysqld-nt.exe  - ...

  8. WebService基本概念及原理

    一.Web Service基本概念 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.Web Service也叫XML Web Service WebService是一种可以接收从I ...

  9. java.lang.OutOfMemoryError: Java heap space的解决方法

    windows->preferences->Java->Installed JRES->edit->Default VM Arguments添加-Xms256m -Xmx ...

  10. vertical-align 垂直居中

    基线:字母‘x’的底部: 中线:与基线的距离为小写字母x高度的一半(即0.5ex),而ex同font-size相关,大部分浏览器认为1ex = 0.5em(em同样也是相对单位,不是绝对单位),因此会 ...