题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2178

sol  :是谁.......是谁往题里下毒......

   辛普森积分,每次判断左边+右边是否-lastans是否<eps,递归处理

   公式:f'(l~r)=(r-l)*(f(l)+f(r)+4*f(mid))/6

   f(i)表示x=i时与圆相交部分的和,然后直接上辛普森积分就可以水过了

   P.S.此题有坑QAQ

     eps设成1e-13才能过,1e-12会WA

     需要剪枝:将包含在其他圆内的圆删去

   P.S.此题有毒.....不知道为什么排序时写cmp就TLE了,然而重载运算符就AC了也是很迷啊QAQ

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define eps 1e-13
using namespace std;
const int Mx=;
int n,tot,st,to;
bool vis[Mx];
double L[Mx],R[Mx];
struct Node { double x,y,r; } str[Mx];
struct Line { double l,r; } line[Mx];
double dis(Node a,Node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); }
bool cmp1(Node a,Node b) { return a.r<b.r; }
bool cmp2(Node a,Node b) { return a.x-a.r<b.x-b.r; }
bool operator < (Line a,Line b) { return a.l<b.l; }
double cal(double fl,double fmid,double fr,double r_l) { return r_l*(fl+fr+*fmid)/; }
double get_f(double x)
{
double ans=; tot=;
for(int i=;i<=n;i++)
if(x>=L[i]&&x<=R[i])
{
double len=sqrt(str[i].r*str[i].r-(str[i].x-x)*(str[i].x-x));
line[++tot].l=str[i].y-len; line[tot].r=str[i].y+len;
}
sort(line+,line+tot+);
for(int i=,j;i<=tot;i++)
{
double minl=line[i].l,minr=line[i].r;
for(j=i+;j<=tot;j++)
{
if(line[j].l>minr) break;
if(line[j].r>minr) minr=line[j].r;
}
ans+=minr-minl; i=j-;
}
return ans;
}
double simpson(double l,double r,double mid,double fl,double fr,double fmid,double lastans)
{
double mid1=(l+mid)/,mid2=(mid+r)/,fmid1=get_f(mid1),fmid2=get_f(mid2);
double ans1=cal(fl,fmid1,fmid,mid-l),ans2=cal(fmid,fmid2,fr,r-mid);
if(fabs(ans1+ans2-lastans)<eps) return ans1+ans2;
return simpson(l,mid,mid1,fl,fmid,fmid1,ans1)+simpson(mid,r,mid2,fmid,fr,fmid2,ans2);
}
void solve()
{
double ans=0.00;
for(int i=,j;i<=n;i++)
{
st=i; double minl=L[i],minr=R[i],minmid;
for(j=i+;j<=n;j++)
{
if(L[j]>minr) break;
if(R[j]>minr) minr=R[j];
}
to=j-,i=to,minmid=(minl+minr)/;
double fl=get_f(minl),fr=get_f(minr),fmid=get_f(minmid),lstans=cal(fl,fmid,fr,minr-minl);
ans+=simpson(minl,minr,minmid,fl,fr,fmid,lstans);
}
printf("%.3lf",ans);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lf%lf%lf",&str[i].x,&str[i].y,&str[i].r);
sort(str+,str++n,cmp1);
//剪枝
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(fabs(str[j].r-str[i].r)>=dis(str[j],str[i]))
{
vis[i]=; break;
}
for(int i=,tmp=,mx=n;i<=mx;i++) if(!vis[i]) str[++tmp]=str[i],n=tmp;
//
sort(str+,str++n,cmp2);
for(int i=;i<=n;i++) L[i]=str[i].x-str[i].r,R[i]=str[i].x+str[i].r;
solve();
return ;
}

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. 【BZOJ2178】圆的面积并(辛普森积分)

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

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

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

  8. JAVA求圆的面积

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

  9. c语言求平面上2个坐标点的直线距离、求俩坐标直线距离作为半径的圆的面积、递归、菲波那次数列、explode

    #include <stdio.h> #include <math.h> #include <string.h> char explode( char * str ...

  10. 【BZOJ】2178: 圆的面积并

    http://www.lydsy.com/JudgeOnline/problem.php?id=2178 题意:给出n<=1000个圆,求这些圆的面积并 #include <cstdio& ...

随机推荐

  1. ES6笔记04-class的基本语法

    JavaScript 语言中,生成实例对象的传统方法是通过构造函数. ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. clas ...

  2. JDK5 新特性

     JDK5新特性目录导航: 自动拆装箱 Foreach 静态导入 可变参数 Var args 枚举 格式化输出 泛型 ProcessBuilder 内省 线程并发库(JUC) 监控和管理虚拟机 元数据 ...

  3. VS2013未能正确加载的问题【转载】

    今天使用电脑,关机重启时,WINDOWS提示“正在配置中,请勿关机” 的提醒,等重启后,打开VS2013就提示了未加载成功的问题,如下图: 我的解决方法是:找到VS2013开发人员命令提示:在窗口中输 ...

  4. Lucene简单总结

    Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...

  5. Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec

    本话题会涉及到: Lo.Hi.HiByte.LoWord.HiWord.MakeWord.MakeLong.Int64Rec 譬如有一个 Cardinal 类型的整数: 1144201745其十六进制 ...

  6. C语言基础篇(三) 指针

    导航: 1.指针     2. 数组     3. 结构体,共用体     4. 内存分布图     5. 段错误分析 ----->x<------------->x<---- ...

  7. 裸机——iNand

    1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...

  8. sql查询平均下单时间

    SQL查询订单平均审核时长 今天在写一个sql,需求是算一个订单在执行状态中的各个节点的时长 比如在订单中,状态0为开始接单,状态3为已经审核,那么现在需要计算每个客服的平均审核时长 像图中所示:这个 ...

  9. Leetcode 337. 打家劫舍 III

    题目链接 https://leetcode.com/problems/house-robber-iii/description/ 题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可 ...

  10. 使用perl发邮件

    如果你使用的是 window 系统,没有 sendmail 工具.这时你就可以使用 perl 的 MIME:Lite 模块作为邮件客户端来发送邮件. 这里我们直接用 cpan 来安装(需要 root ...