倒着考虑,加入一个圆,判断和前面有没有完全覆盖的情况。

如果没有,和圆盘一一取交集,然后计算它们的并集,然后计算即可。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define eps 1e-8
#define sqr(x) x*x
#define ll long long
#define mp make_pair const double pi=acos(-1.0); struct Vector{
double x,y;
void print()
{
printf("Vector -> (%.3f,%.3f)\n",x,y);
}
}; struct Point{
double x,y;
void print()
{
printf("Point . (%.3f,%.3f)\n",x,y);
}
}; Vector operator + (Vector a,Vector b)
{Vector ret;ret.x=a.x+b.x;ret.y=a.y+b.y;return ret;} Vector operator - (Vector a,Vector b)
{Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;} Point operator + (Point a,Vector b)
{Point ret;ret.x=a.x+b.x;ret.y=a.y+b.y;return ret;} Vector operator - (Point a,Point b)
{Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;} Vector operator * (Vector a,double b)
{Vector ret;ret.x=a.x*b;ret.y=a.y*b;return ret;} double operator * (Vector a,Vector b)
{return a.x*b.y-a.y*b.x;} Vector Turn(Vector a,double b)
{
Vector ret;
ret.x=a.x*cos(b)-a.y*sin(b);
ret.y=a.x*sin(b)+a.y*cos(b);
return ret;
} void debug()
{
Vector v1,v2,v3; Point p1,p2,p3;
v1.x=3;v1.y=0;v2.x=0;v2.y=2;
printf("Test one\n");
v1.print(); v2.print(); printf("The Area is %.3f\n\n",v1*v2);
printf("Tet Two\n");
v1.print(); v1=Turn(v1,pi/4);
printf("Turn in π/4\n");
v1.print(); printf("\n");
v1=Turn(v1,-pi/4);
printf("Turn in -π/4\n");
v1.print(); printf("\n");
} int n; struct Circle{
double x,y,r;
void print()
{
printf("Circle (%.3f,%.3f) r = %.3f\n",x,y,r);
}
}a[1005]; double dst(double x1,double y1,double x2,double y2)
{return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));} int dcmp(double x)
{
if (x>eps) return 1;
if (fabs(x)<eps) return 0;
return -1;
} bool in(Circle a,Circle b)
{
if (dcmp(dst(a.x,a.y,b.x,b.y)-(b.r-a.r))<=0) return true;
return false;
} struct Cut_Cir{
double l,r;
void print()
{
printf("Ang (%.3f,%.3f)\n",l,r);
}
}sta[1000005];
int top=0; double nege(double x)
{
if (dcmp(x)==-1) x+=2*pi;
while (dcmp(x-2*pi)>=0) x-=2*pi;
return x;
} void Cut(int pos)
{
top=0; double dist; Vector v0,v1,v2;
F(i,pos+1,n)
if ((dist=dst(a[pos].x,a[pos].y,a[i].x,a[i].y))<a[pos].r+a[i].r)
{
double ang; ang=(sqr(a[pos].r)+sqr(dist)-sqr(a[i].r))/(2*a[pos].r*dist);
if (ang>1.0) continue;
ang=acos(ang);
v0.x=a[i].x-a[pos].x;v0.y=a[i].y-a[pos].y;
v0=v0*(1.0/sqrt(sqr(v0.x)+sqr(v0.y))*a[pos].r);
v1=Turn(v0,ang);
v2=Turn(v0,-ang);
double t1=atan2(v1.y,v1.x),t2=atan2(v2.y,v2.x);
t1+=pi;t2+=pi;
while (t1>2*pi) t1-=2*pi;
while (t2>2*pi) t2-=2*pi;
if (t1<t2)
{
++top;
sta[top].l=0;
sta[top].r=t1;
++top;
sta[top].l=t2;
sta[top].r=2*pi;
}
else
{
++top;
sta[top].l=t2;
sta[top].r=t1;
}
}
} double C(Circle a)
{return a.r*2*pi;} bool cmp2(Cut_Cir a,Cut_Cir b)
{return a.l<b.l;} double cal(double r)
{
sort(sta+1,sta+top+1,cmp2);
double now=0,ret=0;
F(i,1,top)
{
now=max(now,sta[i].l);
ret+=max(0.0,sta[i].r-now);
now=max(now,sta[i].r);
}
return ret*r;
} double ans=0; int main()
{
scanf("%d",&n);
F(i,1,n) scanf("%lf%lf%lf",&a[i].r,&a[i].x,&a[i].y);
F(i,1,n)
{
int flag=1;
F(j,i+1,n) if (in(a[i],a[j]))
{
flag=0;
}
if (!flag) continue;
Cut(i);
ans+=C(a[i]);
ans-=cal(a[i].r);
}
printf("%.3f\n",ans);
}

  

BZOJ 1043 [HAOI2008]下落的圆盘 ——计算几何的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    题目描述 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. 输入 第一行为1个整数n,N<=1000接下来n行每行3个实 ...

  7. 1043: [HAOI2008]下落的圆盘

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1725  Solved: 743[Submit][Status][Discuss] Descripti ...

  8. JZYZOJ1502 [haoi2008]下落的圆盘 计算几何 贪心

    http://172.20.6.3/Problem_Show.asp?id=1502这种题用了快一天才写出来也是真的辣鸡.主要思路就是计算一下被挡住的弧度然后对弧度进行贪心.最开始比较困扰的是求弧度值 ...

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

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

随机推荐

  1. Jenkins执行shell脚本启动tomcat失败解决方法

    环境:Centos 7 Jenkins版本:2.124 状况:Jenkins会执行服务器某个目录下的Shell, 脚本中功能是复制替换某两个配置文件,然后关闭tomcat,重启Tomcat. 但是,T ...

  2. CNNs 在图像分割中应用简史: 从R-CNN到Mask R-CNN

    作者:嫩芽33出处:http://www.cnblogs.com/nenya33/p/6756024.html 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须 ...

  3. UVA 10817 - Headmaster's Headache(三进制状压dp)

    题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pag ...

  4. 爆零系列—补题A

    http://codeforces.com/contest/615/problem/A 读错题 结果发现是无脑题  直接标记统计 #include<cstdio> #include< ...

  5. 利用VS自带的命令行工具查看和生产PublicKeyToken

    使用VS2008(或其他版本)命令行工具,键入:SN -T C:\*****.dll 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有强命 名,则不会有PublicKeyT ...

  6. shell脚本,通过一个shell程序计算n的阶乘。

    [root@localhost ~]# cat jiechen.sh #!/bin/bash #设计一个shell程序计算n的阶乘,要求: #.从命令行接收参数n; #.在程序开始后立即判断n的合法性 ...

  7. ASP.NET 开发人员不必担心 Node 的五大理由

    哦别误会……我真的很喜欢 Node,而且我觉得它提出的概念和模式将在很长一段时间内,对服务端 Web 编程产生深远的影响.即使随着时间的推移 Node 过气了,我们肯定可以从下一个牛逼玩意身上或多或少 ...

  8. 基于PassThru的NDIS中间层驱动程序扩展

    基于PassThru的NDIS中间层驱动程序扩展                                  独孤求真 概要:开发一个NDIS驱动是一项相对复杂的工作,这一方面是由于核心驱动本身 ...

  9. 变色龙启动MAC时,错误信息“ntfs_fixup: magic doesn't match:”的解决办法

    如下是变色龙启动的bdmesg,解决办法就是用mac的磁盘管理器,对ntfs分区进行检验修复.需要安装ntfs的驱动支持. 实在不行,就删除调整过大小的分区,重新用Windows的磁盘管理器重新分区. ...

  10. CSS 布局经典问题初步整理

    CSS 定位问题 主要就是经典的绝对定位,相对定位问题. 10个文档学布局:通过十个例子讲解布局,主要涉及相对布局,绝对布局,浮动. 百度前端学院笔记 – 理解绝对定位:文章本身一般,几篇参考文献比较 ...