传送门

首先考虑两个圆覆盖的情况,我们可以求出圆心与交点连线 $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]下落的圆盘的更多相关文章

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

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

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

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

  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. 定时器的写法 winform

    private void timer1_Tick(object sender, EventArgs e) { if ( tttttflag) { Action action = SyncCompany ...

  2. 私有ip地址知多少?

    1.私有ip的由来 在现在的网络中,ip地址分为公网ip地址和私有ip地址.公网ip是在Internet中使用的ip地址,而私有ip地址是在局域网中使用,在Internet上不使用. 由于我们目前使用 ...

  3. Shell中的特殊字符(三)

    一 通配符 [root@192 test]# touch abc [root@192 test]# touch abcd [root@192 test]# touch 012 [root@192 te ...

  4. CodeForces 1200D White Lines

    cf题面 Time limit 1500 ms Memory limit 262144 kB 解题思路 官方题解 1200D - White Lines Let's consider a single ...

  5. 01-scrapy框架

    1.Scrapy图例: Scrapy Engine(引擎): 负责Spider.ItemPipeline.Downloader.Scheduler中间的通讯,信号.数据传递等. Scheduler(调 ...

  6. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  7. uiautomatorviewer报错 Error taking device screenshot: EOF

    报以下错误 估计是端口冲突 解决方法: 1. netstat -ano | findstr 5037  查看占用5037端口的进程 2. taskkill /pid 10508 /f  杀掉此进程 3 ...

  8. Redis单节点部署

    安装Redis 由于REDIS使用单线程处理请求,CPU的快慢最对REDIS的性能有较大影响,官方建议INTEL的CPU,其效率能比AMD高一倍左右. 下载Redis:wget http://down ...

  9. 突破css选择器的局限,实现一个css地址选择器?

    首先看一个效果,注意地址栏的变化 然后思考一下,用css如何实现? css选择器的局限 选择器是css中的一大特色,用于选择需要添加样式的元素. 选择器的种类有很多,比如 元素选择器 p {color ...

  10. (转)openssl 命令: openssl req 命令详解

                                      openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书.本文就主要记录一下open ...