LINK:下落的圆盘

计算几何。n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度。

在做这道题之前有几个前置知识。

极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系。

如:在平面上取一点 O 叫做极点 从O出发引一条射线Ox 称为极轴。通常规定角度取逆时针方向为正。

极角:在极坐标系中 平面上任何一点到极点的连线和极轴的夹角叫做极角。

那么 我们可以发现极角的大小为0~360度(考虑正角。

极角可以进行排序 由小到大的那种。

那么对于平面上一个点(x,y)到极点的连线 和极轴x的夹角大小为 atan2(y/x).

atan2指的tan的反函数是方位角 atan2 比 atan稳定 所以我们使用atan2.

但是我们要求出极角来 这个返回的是方位角 如果当前角度为正 那么就是极角 如果为负 我们需要将其加上2pi 就变成极角了。

接下来就可以做这道题了 首先考虑两圆相交如何求夹角?

余弦定理+acos函数即可 n^2求交 然后我们发交的地方只算一次 所以可以利用极角来做。

求出所有的极角之后 按极角排序 然后就是直线的覆盖问题。

const int MAXN=1010;
const double pi=acos(-1.0);
struct wy
{
db pl,pr;
bool operator <(const wy &a)const {return pl<a.pl;}
}a[MAXN<<1];
db x[MAXN],y[MAXN],r[MAXN],ans;
int cnt,n;
int main()
{
freopen("1.in","r",stdin);
gt(n);
rep(1,n,i)gf(r[i]),gf(x[i]),gf(y[i]);
rep(1,n,i)
{
ans+=2*pi*r[i];
cnt=0;
rep(i+1,n,j)
{
db d=pf(x[i]-x[j])+pf(y[i]-y[j]);
if(pf(r[i]+r[j])<=d)continue;
if(pf(r[i]-r[j])>=d)
{
if(r[i]>r[j])continue;
else a[++cnt].pl=0,a[cnt].pr=2*pi;
}
else
{
db w=acos((pf(r[i])+d-pf(r[j]))/(2*r[i]*sqrt(d)));
db ww=atan2(y[j]-y[i],x[j]-x[i]);//方位角
if(ww<0)ww+=2*pi;++cnt;//极角
a[cnt].pl=ww-w;a[cnt].pr=ww+w;
if(a[cnt].pl<0)++cnt,a[cnt].pl=a[cnt-1].pl+2*pi,a[cnt-1].pl=0,a[cnt].pr=2*pi;
else if(a[cnt].pr>2*pi)++cnt,a[cnt].pr=a[cnt-1].pr-2*pi,a[cnt-1].pr=2*pi,a[cnt].pl=0;
}
}
sort(a+1,a+1+cnt);
db last=-1;
rep(1,cnt,j)
{
if(a[j].pr<=last)continue;
if(a[j].pl>last)ans-=(a[j].pr-a[j].pl)*r[i];
else ans-=(a[j].pr-last)*r[i];
last=a[j].pr;
}
}
printf("%.3lf\n",ans);
return 0;
}

luogu P2510 [HAOI2008]下落的圆盘的更多相关文章

  1. 洛谷P2510 [HAOI2008]下落的圆盘(计算几何)

    题面 传送门 题解 对于每个圆,我们单独计算它被覆盖的周长是多少 只有相交的情况需要考虑,我们需要知道相交的那段圆弧的角度,发现其中一个交点和两个圆的圆心可以构成一个三角形且三边都已经知道了,那么我们 ...

  2. P2510 [HAOI2008]下落的圆盘

    传送门 首先考虑两个圆覆盖的情况,我们可以求出圆心与交点连线 $A$ 的极角 具体就是求出两圆心连线 $B$ 极角加上余弦定理加反余弦求出 $A,B$ 之间夹角 ,然后覆盖了多少就可以得出 但是多个圆 ...

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

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

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

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

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

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

  6. [HAOI2008]下落的圆盘

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

  7. bzoj1043 [HAOI2008]下落的圆盘

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

  8. BZOJ1043:[HAOI2008]下落的圆盘——题解(配图片)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周 ...

  9. Bzoj1313 [HAOI2008]下落的圆盘

    有 n 个圆盘从天而降,后面落下的可以盖住前面的.最后按掉下的顺序,在平面上依次测得每个圆盘的圆心和半径,问下落完成后从上往下看,整个图形的周长是多少,即你可以看到的圆盘的轮廓的圆盘的轮廓总长.例如下 ...

随机推荐

  1. 百万级别数据Excel导出优化

    前提 这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出. 笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现 ...

  2. python处理json总结

    一.首先,了解下什么是JSON? JSON:JavaScript Object Notation [JavaScript 对象表示法] JSON 是一种轻量级的数据交换格式,完全独立于任何程序语言的文 ...

  3. 没错,用三方 Github 做授权登录就是这么简单!(OAuth2.0实战)

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享. 上一篇<OAuth2.0 的四种授权方式>文末说过,后续要来一波OAuth2.0实战,耽误了几天今儿终于补上了. ...

  4. Java设计模式 --- 七大常用设计模式示例归纳

    设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 行为型模式:模 ...

  5. Cyber Security - Palo Alto Firewall Objects Addresses, Services, and Groups(1)

    Address Objects and Groups Creating address objects. Organizing address objects with address groups ...

  6. Oracle基础概述

    本部分主要参考”风哥“的Oracle入门视频. 一.体系结构概述 1.物理结构(文件结构) Oracle有四种文件:控制文件.数据文件.日志文件.参数文件 其中日志文件分为两类:联机日志文件.归档日志 ...

  7. P1469 找筷子

    摘要:有n根(n为奇数)长短不一的筷子,里面可以凑成(n-1)/2双筷子,只剩下一根不能凑对,问那根不能凑对的筷子有多长. 乍听起来好像不难,桶是一个好东西,可是一看数据:对于100%的数据,N< ...

  8. 什么是viewstate,能否禁用?是否所用控件都可以禁用

    viewstate用于在两次postback之间保持状态的一种机制禁用viewstate将不能在回发之间保存状态 当控件状态无关使用viewstate将造成性能问题时需要禁用viewstate Vie ...

  9. Windows 下Java JDK的下载与安装

    前言: 因为本机已经配置完毕了,本次使用的是虚拟机中的Win7系统,Win10系统操作步骤基本完全一样,不同的地方会在下面的步骤中指出. 一.JDK的下载 为了计算机安全,我们首先要做到的就是尽量在官 ...

  10. 新阿里云服务器从0开始配置为python开发环境

    由于每次打开linux虚拟机比较麻烦,于是尝试一下云服务器,在阿里云领取了一个月的试用服务器,这里记录一下新服务器从0配置成python开发环境的步骤,以便以后配置新服务器时有个参考. 免费领取一个月 ...