Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1725  Solved: 743
[Submit][Status][Discuss]

Description

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

Input

  第一行为1个整数n,N<=1000
接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标.

Output

  最后的周长,保留三位小数

Sample Input

2
1 0 0
1 1 0

Sample Output

10.472
 
这题让我想到了线段覆盖。。。输错一个double调了我一晚上
利用三角函数求出每个圆盘覆盖先前圆盘弧度的范围,最后统计总共覆盖了多少弧度,计算出没有被覆盖的弧度大小,乘以半径就是周长
 
 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iterator>
#include<vector>
using namespace std; const int MAXN=;
const double pi=acos(-1.0);
#define sqr(x) (x)*(x) struct Line
{
double l,r;
};
double r[MAXN],x[MAXN],y[MAXN];
vector<Line> L[MAXN];
vector<Line>::iterator iter; int n;
double ans; bool cmp(Line a,Line b)
{
return a.l<b.l;
} double dist(int a,int b)
{
return sqrt(sqr(x[a]-x[b])+sqr(y[a]-y[b]));
} bool conta(int a,int b)
{
return r[a]-r[b]>=dist(a,b);
} bool inter(int a,int b)
{
return r[a]+r[b]>=dist(a,b);
} void insrad(int a,int b)
{
double d=dist(a,b);
double rad=acos((sqr(r[a])+sqr(d)-sqr(r[b]))/(*r[a]*d));
double st=atan2(x[a]-x[b],y[a]-y[b]);
if(st-rad<-pi)
{
L[a].push_back((Line){st-rad+*pi,pi});
L[a].push_back((Line){-pi,st+rad});
return;
}
if(st+rad>pi)
{
L[a].push_back((Line){st-rad,pi});
L[a].push_back((Line){-pi,st+rad-*pi});
return;
}
L[a].push_back((Line){st-rad,st+rad});
} double cal(int x)
{
for(int i=x+;i<=n;i++)
if(conta(i,x)) return ;
for(int i=x+;i<=n;i++)
if(!conta(x,i)&&inter(x,i))
insrad(x,i);
sort(L[x].begin(),L[x].end(),cmp);
double t=,last=-pi;
for(iter=L[x].begin();iter!=L[x].end();iter++)
if(iter->l>last)
{
t+=iter->l-last;
last=iter->r;
}
else last=max(last,iter->r);
t+=pi-last;
return t*r[x];
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf %lf %lf",&r[i],&x[i],&y[i]);
for(int i=;i<=n;i++)
ans+=cal(i);
printf("%.3lf\n",ans);
return ;
}

1043: [HAOI2008]下落的圆盘的更多相关文章

  1. 【BZOJ】1043: [HAOI2008]下落的圆盘(计算几何基础+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1043 唯一让我不会的就是怎么求圆的周长并QAAQ... 然后发现好神!我们可以将圆弧变成$[0, 2 ...

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

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

  3. 1043: [HAOI2008]下落的圆盘 - BZOJ

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

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

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

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

    倒着考虑,加入一个圆,判断和前面有没有完全覆盖的情况. 如果没有,和圆盘一一取交集,然后计算它们的并集,然后计算即可. #include <map> #include <cmath& ...

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

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

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

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

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

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

  9. BZOJ 1043 【bzoj1043】[HAOI2008]下落的圆盘 | 暴力么??

    题目: 题解: 大概是黄学长的博客 #include<cstdio> #include<algorithm> #include<cstring> #include& ...

随机推荐

  1. POJ1027 The Same Game

    题目来源:http://poj.org/problem?id=1027 题目大意: 题目说的就是现在蛮流行的手机小游戏popstar,求用贪心方法能得到多少分. 小球有三种颜色:R/G/B.横向.纵向 ...

  2. JS事件之鼠标悬浮窗(鼠标悬浮窗抖动问题的解决)

    鼠标进入显示悬浮窗,思路有简单有困难. 首先要注意的是我们要给悬浮窗设置position为absolute,不然我们改了 style.left style.top发现没有变化很尴尬.其余的内容看起来就 ...

  3. LeetCode初级算法(其他篇)

    目录 缺失数字 位1的个数 颠倒二进制位 有效的括号 汉明距离 帕斯卡三角形 缺失数字 最初的想法是将0到n全部加起来,再减去输入的数字之和,那么差如果非零的话就是我们所需要的数字.但是一想,可能会发 ...

  4. postgis 赋予postgresql空间数据库的能力

    安装: Windows:postgresql的bin目录下:运行stackbuilder,一步一步按照提示来就行了 Ubuntu: apt-get install postgresql-9.3-pos ...

  5. Murano package

    Murano have 2 package types: HOT package with Heat template inside and MuranoPL package with MuranoP ...

  6. 关于vi 分屏的一些指令

    分屏都是以ctrl + W(大写) 首先,ctrl+ W  , v    为切屏 之后用 :e 打开其他文件 ctrl + W , c 为关闭当前分屏 ctrl + W , h 为切换到左侧分屏   ...

  7. 10 - EmbeddedChannel-测试ChannelHandler链

    方法 职责 writeInbound(Object... msgs) 将入站消息写入到EmbeddedChannel中 readInbound() 从EmbeddedChannel中读取一个入站消息, ...

  8. Spring事务管理的xml方式

    一个业务的成功: 调用的service是执行成功的,意味着service中调用的所有的dao是执行成功的.  事务应该在Service层统一控制. 如果手动去实现,则需要对dao进行代理,在方法前后进 ...

  9. node官方docker镜像运行bower 提示 permission denied 解决方法

    在使用node官方docker镜像部署node应用时,应用需要npm的scripts中运行bower install 来安装前端包,但是用docker 构建时失败,提示 permission dein ...

  10. DockerSwarm 微服务部署

    一.简介 之前<服务Docker化>中,使用 docker-compose.yml 来一次配置启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-comp ...