https://www.lydsy.com/JudgeOnline/problem.php?id=2178

给出N个圆,求其面积并。

simpson,将圆劈成两半,假设上面的叫上壳,下面的叫下壳,对这两个壳分别做一遍simpson,相减就是答案。

当然优化时间可以去掉完全包含的圆。

以及相减的时候注意同一坐标的不同解,我们要求他的并。

另外精度死活调不对,参考了:https://www.cnblogs.com/SfailSth/p/6360277.html的代码才过orz

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef double dl;
const int N=;
const dl eps=1e-;
const dl INF=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct cir{
int x,y,r;
}p[N];
int n,tag[N];
struct node{
dl l,r;
}q[N];
inline bool cmp1(node a,node b){
return a.l<b.l||(a.l==b.l&&a.r<b.r);
}
inline bool cmp2(cir a,cir b){
return a.r<b.r;
}
inline dl f(dl x){
int cnt=;
for(int i=;i<=n;i++){
if(fabs(p[i].x-x)-p[i].r<-eps){
dl t=sqrt(p[i].r*p[i].r-(x-p[i].x)*(x-p[i].x));
q[++cnt].l=p[i].y-t;
q[cnt].r=p[i].y+t;
}
}
sort(q+,q+cnt+,cmp1);
dl h=-INF,ans=;
for(int i=;i<=cnt;i++){
if(h<q[i].l)ans+=q[i].r-q[i].l,h=q[i].r;
else if(h<q[i].r)ans+=q[i].r-h,h=q[i].r;
}
return ans;
}
inline dl simpson(dl l,dl r){
dl mid=(l+r)/;
return (f(l)+*f(mid)+f(r))*(r-l)/;
}
inline dl asr(dl l,dl r,dl ans){
dl mid=(l+r)/;
dl l1=simpson(l,mid),r1=simpson(mid,r);
if(fabs(l1+r1-ans)<eps)return l1+r1;
return asr(l,mid,l1)+asr(mid,r,r1);
}
int main(){
n=read();
for(int i=;i<=n;i++){
p[i].x=read(),p[i].y=read(),p[i].r=read();
}
sort(p+,p+n+,cmp2);
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
int x=p[i].x-p[j].x,y=p[i].y-p[j].y,r=p[j].r-p[i].r;
if(x*x+y*y<=r*r){
tag[i]=;break;
}
}
}
int tot=;
for(int i=;i<=n;i++)if(!tag[i])p[++tot]=p[i];
n=tot;
printf("%.3lf\n",asr(-INF,INF,simpson(-INF,INF)));
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ2178:圆的面积并——题解的更多相关文章

  1. [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并

    [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并 题目大意: 求\(n(n\le1000)\)个圆的面积并. 思路: 对于一个\( ...

  2. BZOJ2178: 圆的面积并(格林公式)

    题面 传送门 题解 好神仙-- 先给几个定义 平面单连通区域:设\(D\)是平面内一区域,若属于\(D\)内任一简单闭曲线的内部都属于\(D\),则称\(D\)为单连通区域.通俗地说,单连通区域是没有 ...

  3. BZOJ2178 圆的面积并 计算几何 辛普森积分

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2178.html 题目传送门 - BZOJ2178 题意 给出 $n(n\leq 1000)$ 个圆,求 ...

  4. bzoj2178: 圆的面积并

    Description 给出N个圆,求其面积并 Input 先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数 Output 面积并,保留三位小数 ...

  5. BZOJ2178 圆的面积并(simpson积分)

    板子题.可以转一下坐标防止被卡.精度和常数实在难以平衡. #include<iostream> #include<cstdio> #include<cmath> # ...

  6. 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]

    [题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...

  7. 【BZOJ2178】圆的面积并(辛普森积分)

    [BZOJ2178]圆的面积并(辛普森积分) 题面 BZOJ 权限题 题解 把\(f(x)\)设为\(x\)和所有圆交的线段的并的和. 然后直接上自适应辛普森积分. 我精度死活一个点过不去,不要在意我 ...

  8. hdu5858 Hard problem(求两圆相交面积)

    题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  9. JAVA求圆的面积

    import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public stati ...

随机推荐

  1. ES2015学习笔记

    ECMA6学习笔记 参考资料 ECMAScript6入门:http://es6.ruanyifeng.com/ 官方文档:https://babeljs.io/learn-es2015/ 开发软件:W ...

  2. Qt-QML-C++交互实现文件IO系统-后继-具体文件IO的实现

    在上一篇文章中,我大致将这个QML中的文件IO类搭出了大致的框架,那么,今天抽时间写了一点文件的读写,这里我使用的文件流来读写文件. 文件结构如图 在QML中调用这个类了,就见简单的读取了一个JSON ...

  3. 使用python+selenium控制手工已打开的浏览器

    我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...

  4. hihocoder刷题 扫雷游戏

    题目1 : 扫雷游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N × N的方格矩阵,其中每个格子或者是'*',表示该位置有一个地雷:或者是'.',表示该位 ...

  5. 孤荷凌寒自学python第八十二天学习爬取图片2

    孤荷凌寒自学python第八十二天学习爬取图片2 (完整学习过程屏幕记录视频地址在文末) 今天在昨天基本尝试成功的基础上,继续完善了文字和图片的同时爬取并存放在word文档中. 一.我准备爬取一个有文 ...

  6. 【20180807模拟测试】t1 function

    low逼的我也只能写这样的水题... 题面 对于一个整数,定义 f(x)为他的每个数位的阶乘的乘积.例如 f(135)=1! * 3! * 5! =720.给出一个数 a(可以包含前缀零),a 满足他 ...

  7. docker学习2

    今天继续学习docker! 搜索镜像 docker search centos 下载镜像 docker pull name(镜像名字) 查看镜像docker images 字段含义分析: TAG:仓库 ...

  8. CPU设计学习-流水线

    各种名词 标量流水线 超级流水线 超标量流水线与多发射技术 经典五级流水线 IF |Instruction Fetch,取指 ID |Instruction Decode,译码 EX |Execute ...

  9. C++ 学习笔记之——STL 库 queue

    1. 队列 queue 队列是一种容器适配器,专门用来满足先进先出的操作,也就是元素在容器的一端插入并从另一端提取. bool empty() const; 返回队列是否为空: size_type s ...

  10. 本周PSP图

    本周共写博文5篇,共计4800字,知识点:知道了博客应当如何写,接触了博客园,阅读了构建之法 内容 开始时间 结束时间 中断时间 共计时间 9月8日博文 22:00 22:55 10min聊天 45m ...