luogu P2510 [HAOI2008]下落的圆盘
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]下落的圆盘的更多相关文章
- 洛谷P2510 [HAOI2008]下落的圆盘(计算几何)
题面 传送门 题解 对于每个圆,我们单独计算它被覆盖的周长是多少 只有相交的情况需要考虑,我们需要知道相交的那段圆弧的角度,发现其中一个交点和两个圆的圆心可以构成一个三角形且三边都已经知道了,那么我们 ...
- P2510 [HAOI2008]下落的圆盘
传送门 首先考虑两个圆覆盖的情况,我们可以求出圆心与交点连线 $A$ 的极角 具体就是求出两圆心连线 $B$ 极角加上余弦定理加反余弦求出 $A,B$ 之间夹角 ,然后覆盖了多少就可以得出 但是多个圆 ...
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- 【BZOJ1043】[HAOI2008]下落的圆盘 几何
[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. ...
- BZOJ 1043 HAOI2008 下落的圆盘 计算几何
题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后 ...
- [HAOI2008]下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红 色线条的总长度即为所求. Input 第一行为1个整数n,N<=100 ...
- bzoj1043 [HAOI2008]下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input 第一行为1个整数n,N<=1000 ...
- BZOJ1043:[HAOI2008]下落的圆盘——题解(配图片)
http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周 ...
- Bzoj1313 [HAOI2008]下落的圆盘
有 n 个圆盘从天而降,后面落下的可以盖住前面的.最后按掉下的顺序,在平面上依次测得每个圆盘的圆心和半径,问下落完成后从上往下看,整个图形的周长是多少,即你可以看到的圆盘的轮廓的圆盘的轮廓总长.例如下 ...
随机推荐
- C++中vector和堆的常用使用方法&例题:数据流中的中位数
vector常用函数: (1)a.size();//返回a中元素的个数: (2)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5 (3)a[i]; //返回a的第i个元素, ...
- 装机预备技能,Linux系统简介,安装Linux系统,Linux基本操作-云计算学习(2)
装机预备技能 问题 要求安装一台可用的KVM服务器: RHEL与CentOS系统有什么关联? Linux系统中第三块SCSI硬盘如何表示? 步骤 实现此案例需要按照如下步骤进行. 步骤一:RHEL系统 ...
- 【RCTF-2015】bug
信息: 题目来源: RCTF-2015 标签:PHP.SQL注入 解题过程 访问网址,提示需要登陆: 使用admin用户名进行注册,提示: 对登陆页面与注册页面进行Fuzz,没有发现注入点. 登陆后页 ...
- HTML5提高
HTML5提高 前言 我个人觉得,当你学会了一些最基本的标签其实是够用的,但是在很多网页中可以发现很多新的标签.这个时候不知道它是干嘛的实际上心里是非常没底的,所以在这里我打算写一篇HTML5提高的文 ...
- vue组件通讯之provide / inject
什么是 provide / inject [传送门] vue的组件通讯方式我们熟知的有 props $emit bus vuex ,另外就是 provide/inject provide/inject ...
- GitHub 热点速览 Vol.28:有品位程序员的自我修养
作者:HelloGitHub-小鱼干 摘要:一个程序员除了技术好,还得品位高,有什么比一个高颜值的 GUI 更能体现你品味的呢?rocketredis 就是一个高颜值.简约的 Redis 管理界面,比 ...
- 基于.NetCore3.1系列 ——认证授权方案之Swagger加锁
一.前言 在之前的使用Swagger做Api文档中,我们已经使用Swagger进行开发接口文档,以及更加方便的使用.这一转换,让更多的接口可以以通俗易懂的方式展现给开发人员.而在后续的内容中,为了对a ...
- P1290 欧几里德的游戏(洛谷)
欧几里德的两个后代 Stan 和 Ollie 正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数 M 和 N,从 Stan 开始,从其中较大的一个数,减去较小的数的正整数倍,当然, ...
- 如何使用ABP进行软件开发(2) 领域驱动设计和三层架构的对比
简述 上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项目中涉及到的知识点,例如DTO,应用服务层,整洁架构,领域对象(如实体,聚合,值对象)等. 笔者也曾经提到,AB ...
- Redis的字符串底层是啥?为了速度和安全做了啥?
面试场景 面试官:Redis有哪些数据类型? 我:String,List,set,zset,hash 面试官:没了? 我:哦哦哦,还有HyperLogLog,bitMap,GeoHash,BloomF ...