原题

n个圆盘,求下落后能看到的总周长。



红色即为所求


借鉴于黄学长的博客

对于每下落的一个圆盘,处理他后面的圆盘会挡住哪些区域,然后把一整个圆(2\(/pi\))当做一整个区间,每个被覆盖的部分都可以化为一条线段,做线段覆盖就可以得到最后这个圆对答案的贡献了。



详解见代码。

#include<cstdio>
#include<algorithm>
#include<cmath>
#define pi acos(-1)
#define N 1010
typedef long long ll;
using namespace std;
int n,top;
double ans,x[N],y[N],r[N];
struct line
{
double l,r;
line() {}
line(double x,double y) : l(x),r(y) {}
line(int x,double y) : l(x),r(y) {}//鬼畜的构造函数……
bool operator < (const line b) const
{
return l<b.l;
}
}q[N]; inline double dis(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
} bool conta(int a,int b)//判断b圆有没有被a圆完全覆盖
{
if (r[a]>=r[b]+dis(a,b)) return 1;
return 0;
} void inter(int a,int b)
{
double d,t,st,l;
d=dis(a,b);
t=(r[a]*r[a]-r[b]*r[b]+d*d)/(2*d*r[a]);//余弦定理求角(位置见上图)
st=atan2((x[a]-x[b]),(y[a]-y[b]));
l=acos(t);
q[++top]=line(st-l,st+l);//以弧的两个端点当做线段的两个端点
} double cal(int x)//求第x个圆最后能看到的周长
{
for (int i=x+1;i<=n;i++)
if (conta(i,x)) return 0;//如果被其他圆覆盖,就没有贡献
top=0;
for (int i=x+1;i<=n;i++)
if (!conta(x,i) && r[x]+r[i]>=dis(x,i))//这两个圆相交
inter(x,i);//求出被覆盖的部分并简化为线段
double tmp=0,now=0;
for (int i=1;i<=top;i++)//把角度都处理到[0,$2/pi$)中
{
if (q[i].l<0) q[i].l+=2*pi;
if (q[i].r<0) q[i].r+=2*pi;
if (q[i].l>q[i].r)
{
q[++top]=line(0,q[i].r);
q[i].r=2*pi;
}
}
sort(q+1,q+top+1);
for (int i=1;i<=top;i++)//线段覆盖
if (q[i].l>now)
{
tmp+=q[i].l-now;
now=q[i].r;
}
else now=max(now,q[i].r);
tmp+=2*pi-now;
return r[x]*tmp;//能看到的长度
} int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
for (int i=1;i<=n;i++)
ans+=cal(i);
printf("%.3f",ans);
return 0;
}

[bzoj] 1043 下落的圆盘 || 圆上的“线段覆盖”的更多相关文章

  1. bzoj 1043 下落的圆盘 —— 求圆心角、圆周长

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 求出每个圆没被覆盖的长度即可: 特判包含和相离的情况,注意判包含时 i 包含 j 和 ...

  2. BZOJ 1043 下落的圆盘

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

  3. bzoj 1043 [HAOI2008]下落的圆盘——圆的周长

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 算每个圆被它后面的圆盖住了多少圆弧即可.注意判断这个圆完全被后面盖住的情况. #inc ...

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

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

  5. BZOJ 1041: [HAOI2008]圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3621  Solved: 1605[Submit][Sta ...

  6. bzoj 1041: [HAOI2008]圆上的整点 数学

    1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  7. bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 853[Submit][Stat ...

  8. BZOJ 1041 [HAOI2008]圆上的整点:数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...

  9. BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4210  Solved: 1908[Submit][Sta ...

随机推荐

  1. 泉五培训Day2

    T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...

  2. poj_1730_Perfect Pth Powers

    We say that x is a perfect square if, for some integer b, x = b 2. Similarly, x is a perfect cube if ...

  3. js表格打印自动分页demo

    本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...

  4. yii2 的登录注册 轮子

    //利用到了yii2 框架之中的验证规则 进行判定而已 也不是很高深的东西  但是 使用框架自身的轮子 会有安全性能的隐患 1注册reg controller 中 我都以admin 为例子 publi ...

  5. E - Nature Reserve CodeForces - 1059D

    传送门 There is a forest that we model as a plane and live nn rare animals. Animal number iihas its lai ...

  6. python Re库的介绍

    re库的贪婪匹配和最小匹配 后面跟着?变为最小匹配

  7. 3687: 简单题(bitset)

    3687: 简单题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 700  Solved: 319[Submit][Status][Discuss] ...

  8. 通俗版解释网关,IP地址,ARP欺骗,DDOS攻击

    计算机主机网关的作用是什么? 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大爷就是你的网关.当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声 ...

  9. 2.ifconfig

    转载http://www.cnblogs.com/peida/archive/2013/02/27/2934525.html 许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口 ...

  10. 即将到来的5G,我们该做些什么准备?

    本文来自网易云社区. 作者:任长存 5G和4G到底什么区别? 实际上5G只是4G通信技术上的演进,都是在 光速 = 波长*频率,这个数学公式上做文章,为什么这么讲? 首先大家都用过WIFI,WIFI的 ...