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 ...
随机推荐
- Filter配置多个url-pattern
java开发中会用的Filter过滤器,有时候开发需要,在一个Filter中需要配置多个过滤地址,即<url-pattern>,下面就说一下一个Filter过滤器中多个<url-pa ...
- libevent学习四(Working with events)
1.事件的分类 文件可写 文件可读 超时发生 信号发生 用户触发事件 2事件的生命周期 --非 persistent ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第2章.HTTP协议简介
第2章--HTTP协议简介 HTTP协议简介 Abstract: HTTP协议的特性,HTTP请求/响应的过程,HTTP请求/响应的报文格式等知识,最后会演示如何通过Chrome提供的开发者工具,去跟 ...
- lintcode735. Replace With Greatest From Right
Given an array of integers, replace every element with the next greatest element (greatest element o ...
- * 197. Permutation Index【LintCode by java】
Description Given a permutation which contains no repeated number, find its index in all the permuta ...
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...
- 利用AWS的EC2实例配合Putty访问Google账户
首先,我们需要一个amazon的帐号,该帐号可以开始AWS服务,第一次使用时需要绑定信用卡并扣1美元,然后再退还到我们的卡中,就是要验证一下信用卡帐户的有效性哦.有了这个帐号就可以尽情地享受AWS提供 ...
- 机器学习-支持向量机SVM
简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...
- Linux系统查看系统版本命令
以下操作在centos系统上实现,有些方式可能只适用centos/redhat版本系统 uname -a |uname -r查看内核版本信息 [root@node1 ~]# uname -a Linu ...
- “Hello world!”团队第三周贡献分规则
一.贡献规则制定: (1)基础分:9 , 9 , 8 , 7 , 7 , 7 , 6(按在本次编程中承担模块的重要度制定,某一模块重要度的认定通过组内开会讨论决定) (2)会议分:每人没出勤一次会议记 ...