BZOJ2178:圆的面积并——题解
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:圆的面积并——题解的更多相关文章
- [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并
[SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并 题目大意: 求\(n(n\le1000)\)个圆的面积并. 思路: 对于一个\( ...
- BZOJ2178: 圆的面积并(格林公式)
题面 传送门 题解 好神仙-- 先给几个定义 平面单连通区域:设\(D\)是平面内一区域,若属于\(D\)内任一简单闭曲线的内部都属于\(D\),则称\(D\)为单连通区域.通俗地说,单连通区域是没有 ...
- BZOJ2178 圆的面积并 计算几何 辛普森积分
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2178.html 题目传送门 - BZOJ2178 题意 给出 $n(n\leq 1000)$ 个圆,求 ...
- bzoj2178: 圆的面积并
Description 给出N个圆,求其面积并 Input 先给一个数字N ,N< = 1000 接下来是N行是圆的圆心,半径,其绝对值均为小于1000的整数 Output 面积并,保留三位小数 ...
- BZOJ2178 圆的面积并(simpson积分)
板子题.可以转一下坐标防止被卡.精度和常数实在难以平衡. #include<iostream> #include<cstdio> #include<cmath> # ...
- 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]
[题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...
- 【BZOJ2178】圆的面积并(辛普森积分)
[BZOJ2178]圆的面积并(辛普森积分) 题面 BZOJ 权限题 题解 把\(f(x)\)设为\(x\)和所有圆交的线段的并的和. 然后直接上自适应辛普森积分. 我精度死活一个点过不去,不要在意我 ...
- hdu5858 Hard problem(求两圆相交面积)
题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- JAVA求圆的面积
import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public stati ...
随机推荐
- iOS WKWebView添加进度条02
之前写了一个是关于webview添加进度条的,现在补一个WKWebView进度条. //添加一个全局属性 @property(nonatomic,strong)CALayer *progresslay ...
- 「日常训练」School Marks(Codeforces Round 301 Div.2 B)
题意与分析(CodeForces 540B) 题意大概是这样的,有一个考试鬼才能够随心所欲的控制自己的考试分数,但是有两个限制,第一总分不能超过一个数,不然就会被班里学生群嘲:第二分数的中位数(科目数 ...
- 使用flask_limiter设定API配额
前言 闲来无事,突然想到了以前做过的关于后台API安全方面的事,关于接口访问配额的设置,flask有没有很好的库支持呢?一找还真有!主要是对照了库的官方文档自己写了下dome,以供参考. # -*- ...
- TensorFlow入门之MNIST最佳实践-深度学习
在上一篇<TensorFlow入门之MNIST样例代码分析>中,我们讲解了如果来用一个三层全连接网络实现手写数字识别.但是在实际运用中我们需要更有效率,更加灵活的代码.在TensorFlo ...
- Python3 下安装python-votesmart
在python2下安装python-smart还比较容易,而python3中由于很多函数库的变化直接使用python setup.py install 命令来安装的话会导致错误,而导致错误的原因就是p ...
- maven项目中没有resource文件夹的问题
之前使用eclipse创建maven项目,文件夹都是建好的,这几次创建,都没有resource文件夹,需要手动创建resource. 现象描述 在eclipse中,创建maven项目有两种方式: 一种 ...
- Java 单例模式探讨
以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...
- Java学习个人备忘录之接口
abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...
- Java中抽象类也能实例化
在Java中抽象类真的不能实例化么? 在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然 ...
- Git 命令基本应用
两种建立仓库的方法: (1)在本地文件路径下建立仓库:git init (2)在代码托管网站上克隆项目:git clone [url] 查看该分支下的文件情况:git status 添加远程仓库源:g ...