bzoj1043 下落的圆盘

Description

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

Input

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

Output

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

对每个圆,若没被后面的圆完全覆盖,就统计后面的圆覆盖的圆周长度,具体实现可以求出圆周上每个被覆盖区间并取并

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef double ld;
int n;
const ld pi=acos(-1.l),_2pi=pi*2;
struct itv{ld l,r;};
bool operator<(itv x,itv y){return x.l<y.l;}
int ip=0;
ld ans=0;
void maxs(ld&a,ld b){if(a<b)a=b;}
itv is[2007];
struct cir{
    ld x,y,r;
    void init(){
        scanf("%lf%lf%lf",&r,&x,&y);
    }
    bool in(cir w){
        ld a=x-w.x,b=y-w.y;
        return sqrt(a*a+b*b)+r-1e-8<w.r;
    }
    bool cross(cir w){
        ld a=x-w.x,b=y-w.y;
        ld c=sqrt(a*a+b*b);
        return c<r+w.r-1e-8&&c>fabs(r-w.r)+1e-8;
    }
    ld fix(ld x){
        while(x<0)x+=_2pi;
        while(x>_2pi)x-=_2pi;
        return x;
    }
    void cal(cir w){
        ld xd=w.x-x,yd=w.y-y,d=sqrt(xd*xd+yd*yd);
        ld a=atan2(yd,xd);
        ld b=acos((r*r+d*d-w.r*w.r)/(2*r*d));
        ld l=fix(a-b),r=fix(a+b);
        if(l<r)is[ip++]=(itv){l,r};
        else is[ip++]=(itv){0,r},is[ip++]=(itv){l,_2pi};
    }
    void get(){
        std::sort(is,is+ip);
        ld L,R,s=_2pi;
        for(int i=0,j=0;i<ip;i=j){
            L=is[i].l;R=is[i].r;
            while(j<ip&&is[j].l<=R)maxs(R,is[j++].r);
            s-=R-L;
        }
        ans+=s*r;
    }
}cs[1007];
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;++i)cs[i].init();
    for(int i=0;i<n;++i){
        ip=0;
        for(int j=i+1;j<n;++j)if(cs[i].in(cs[j]))goto out;
        for(int j=i+1;j<n;++j)if(cs[i].cross(cs[j]))cs[i].cal(cs[j]);
        cs[i].get();
        out:;
    }
    printf("%.3f",ans);
    return 0;
}
时间: 2024-10-09 01:28:00

bzoj1043 下落的圆盘的相关文章

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

[BZOJ1043][HAOI2008]下落的圆盘 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 题解:对于每个圆,我们枚举它后面的

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

1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1598  Solved: 676[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  Input 第一行为1个整数n,N<=1000接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标

【bzoj1043】[HAOI2008]下落的圆盘 计算几何

题目描述 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. 输入 第一行为1个整数n,N<=1000接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标. 输出 最后的周长,保留三位小数 样例输入 2 1 0 0 1 1 0 样例输出 10.472 题解 计算几何 考虑从下到上的每一个圆,它被其它的圆覆盖了多少.即考虑它被覆盖了多少弧度. 考虑两个圆,如果相离则不覆盖,内含判断一下包含关系. 如果

BZOJ1043:[HAOI2008]下落的圆盘——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红 色线条的总长度即为所求. Input 第一行为1个整数n,N<=1000 接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标. Output 最后的周长,保留三位小数 Sample Input 2 1 0 0 1 1 0 Sample Out

BZOJ1043 [HAOI2008]下落的圆盘

倒过来做,然后就变成了线段覆盖问题了. 线段覆盖就是贪心即可... 但是好烦好烦= =,需要耐心和几何基础2333 1 /************************************************************** 2 Problem: 1043 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:240 ms 7 Memory:872 kb 8 ****************************

【BZOJ1043】【HAOI2008】下落的圆盘 计算几何

链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46564199"); } 题解: 给每个圆求一下: 1. 它是不是被之后的某圆整体覆盖. 2. 它的圆周上有哪些弧段被覆盖了. 然后对于每个圆求一下还剩多少周长即可. 上述的"2."可以用圆的圆心角

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

题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后落下的圆盘和它的覆盖区间 然后求一个区间并就能算出这个圆盘的可见弧长 然后就是相交部分怎么求的问题了 首先两个圆必须相交 然后作圆心1到圆心2的向量 用atan2求出极角 然后利用余弦定理求出两个交点和圆心连线的夹角就可以 注意区间不在[0,2π]的部分要切割成还有一个区间 处理起来事实上不是非常麻

BZOJ 1043 下落的圆盘

Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  Input n ri xi y1 ... rn xn yn Output 最后的周长,保留三位小数 Sample Input 2 1 0 0 1 1 0 Sample Output 10.472 HINT 数据规模 n<=1000 这道题目很好嘴巴,但是写起来有点儿蛋疼. 首先求出每个圆盘被他上面的圆盘覆盖的圆心角的度数α,用(2π-α)*c/2π

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

http://www.lydsy.com/JudgeOnline/problem.php?id=1043 唯一让我不会的就是怎么求圆的周长并QAAQ... 然后发现好神!我们可以将圆弧变成$[0, 2 \pi ]$的直线! 然后一定要注意!起点是$(1, 0)$(单位圆) 首先学了余弦定理... 在三角形ABC中 $$cos A=\frac{|AB|^2+|AC|^2-|BC|^2}{2|AB| |AC|}$$ 证明很简单... $$\begin{align}|{BC}|^2 & = \vec{