P2510 [HAOI2008]下落的圆盘
首先考虑两个圆覆盖的情况,我们可以求出圆心与交点连线 $A$ 的极角
具体就是求出两圆心连线 $B$ 极角加上余弦定理加反余弦求出 $A,B$ 之间夹角 ,然后覆盖了多少就可以得出
但是多个圆覆盖会重复算,所以离线枚举后面的圆,然后把覆盖的区间按极角排序做一遍类似线段覆盖的操作就行了
区间覆盖的时候注意极角可以会算出负数和大于 $2\pi$ 的情况
思路倒挺简单,计算几何实现起来反正就是一堆细节
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const db pi=acos(-1.0),pi2=pi*,eps=1e-;
const int N=;
int n;
inline int dcmp(db x) { if(fabs(x)<eps) return ; return x< ? - : ; }
struct Poi {
db x,y;
Poi (db a=,db b=) { x=a,y=b; }
inline Poi operator - (const Poi &tmp) const {
return Poi(x-tmp.x,y-tmp.y);
}
};
inline db Len(Poi A) { return sqrt(A.x*A.x+A.y*A.y); }
inline db angle(Poi A) { return atan2(A.y,A.x); }
struct Circ {
Poi O; db r;
Circ (Poi a=Poi(,),db b=) { O=a,r=b; }
}C[N];
struct dat {
db ang; int type;
dat (db a=,int b=) { ang=a,type=b; }
inline bool operator < (const dat &tmp) const {
return ang<tmp.ang;
}
}D[N];
db work(int p)
{
db res=; int tot=,cnt=;
for(int i=p+;i<=n;i++)
{
db dis=Len(C[i].O-C[p].O);
if( C[p].r+dis<=C[i].r ) return ;//p被完全覆盖
if( dis>=C[p].r+C[i].r || C[i].r+dis<=C[p].r ) continue;//p没被覆盖,记得可能 i 在 p 里面
db alp=acos( (dis*dis+C[p].r*C[p].r-C[i].r*C[i].r)/(*dis*C[p].r) ),k=angle(C[i].O-C[p].O);
db l=k-alp,r=k+alp;//两个交点的极角
if(dcmp(l)<&&dcmp(r)<) { D[++tot]=dat(l+pi2,); D[++tot]=dat(r+pi2,-); continue; }
if(dcmp(l)>=&&r<=pi2) { D[++tot]=dat(l,); D[++tot]=dat(r,-); continue; }
if(dcmp(l)<&&dcmp(r)>=)
{
D[++tot]=dat(l+pi2,); D[++tot]=dat(pi2,-);
D[++tot]=dat(,); D[++tot]=dat(r,-);
}
if(dcmp(l)>=&&r>pi2)
{
D[++tot]=dat(,); D[++tot]=dat(r-pi2,-);
D[++tot]=dat(l,); D[++tot]=dat(pi2,-);
}
}
sort(D+,D+tot+);
for(int i=;i<=tot;i++)
{
if(D[i].type==&&!cnt) res+=D[i].ang-D[i-].ang;//线段覆盖
cnt+=D[i].type;
}
res+=pi2-D[tot].ang;
return C[p].r*res;
}
int main()
{
n=read(); db a,b,c,ans=;
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf",&a,&b,&c);
C[i]=Circ( Poi(b,c) , a );
}
for(int i=;i<=n;i++) ans+=work(i);
printf("%.3f\n",ans);
return ;
}
P2510 [HAOI2008]下落的圆盘的更多相关文章
- luogu P2510 [HAOI2008]下落的圆盘
LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...
- 洛谷P2510 [HAOI2008]下落的圆盘(计算几何)
题面 传送门 题解 对于每个圆,我们单独计算它被覆盖的周长是多少 只有相交的情况需要考虑,我们需要知道相交的那段圆弧的角度,发现其中一个交点和两个圆的圆心可以构成一个三角形且三边都已经知道了,那么我们 ...
- 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 个圆盘从天而降,后面落下的可以盖住前面的.最后按掉下的顺序,在平面上依次测得每个圆盘的圆心和半径,问下落完成后从上往下看,整个图形的周长是多少,即你可以看到的圆盘的轮廓的圆盘的轮廓总长.例如下 ...
随机推荐
- matlab中画三维图形
这里主要讲述两个方法用matlab画三维图形: 1.mesh函数 先看一个简单的例子: x = ::; y = ::; [X, Y] = meshgrid(x, y); Z = zeros(,); Z ...
- BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- [jvm学习笔记]-类加载过程
JVM类加载的过程 加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作 加载 在加载阶段,虚拟机需要完成3个事情1.通过一个类的全限定名获取定义此类的二进制字节流 ...
- 【gym102394A】Artful Paintings(差分约束系统,二分)
题意:给定一个长为n的序列,每个位置可以选择取或不取,要求构造方案使得: 1.对于前M1个约束,区间[L,R]内取的数量必须严格不少于K 2.对于后M2个约束,区间[L,R]外取的数量必须严格不少于K ...
- 打开ubuntu终端,没有用户名显示,只剩下光标在闪
总结起来就是bash损坏了.bash是用户与操作系统内核交互的工具.bash损坏,则用户无法操作计算机. 推荐两个帖子: https://blog.csdn.net/u011128515/articl ...
- 手动创建Maven项目并建立两个项目之间的依赖关系
用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId -&g ...
- ide破解
https://blog.csdn.net/yangying496875002/article/details/73603303
- python调用c++/c 共享库,开发板上编译的一些坑!
1.对于python,ctypes只能load动态库,但现在我的对象是一个静态库,而且我没有源代码,静态库在编译过程中没有加--fPIC参数,所以我也没办法将其编译为动态库,有没有什么方法在pytho ...
- Linux驱动开发9——kfifo缓冲队列
Kfifo是Linux内核缓冲队列 #include <linux/kfifo.h> 分配kfifo队列,返回值为0表示成功,其他值表示失败 int kfifo_alloc(struct ...
- Maven中的dependency详解
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> & ...