原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2178.html

题目传送门 - BZOJ2178

题意

  给出 $n(n\leq 1000)$ 个圆,求面积并。

  所有圆的圆心坐标和半径都是绝对值不大于 1000 的整数。

题解

  自适应辛普森积分模板题。注意先删掉被其他圆包含的圆。

  但是 bzoj 大概是加过数据了,网上大部分直接自适应辛普森的代码都 TLE 了。

  有一种卡常方法效果很好:

  把 x 坐标按照整点划分成 $O(1000)$ 个区间,对于每一个区间,删除不涉及这个区间的所有圆。然后就过了。

代码

  1. #include <bits/stdc++.h>
  2. #define y1 __zzd12323
  3. using namespace std;
  4. const int N=1005;
  5. const double Eps=1e-9,INF=1e9;
  6. double sqr(double x){
  7. return x*x;
  8. }
  9. int n;
  10. struct Circle{
  11. double x,y,r;
  12. }c[N],_c[N];
  13. bool cmpr(Circle a,Circle b){
  14. return a.r>b.r;
  15. }
  16. struct Seg{
  17. double L,R;
  18. }s[N];
  19. bool cmp(Seg a,Seg b){
  20. return a.L<b.L;
  21. }
  22. double F(double x){
  23. int m=0;
  24. for (int i=1;i<=n;i++){
  25. if (fabs(x-c[i].x)>c[i].r-Eps)
  26. continue;
  27. double M=c[i].y,a=sqrt(sqr(c[i].r)-sqr(x-c[i].x));
  28. s[++m].L=M-a,s[m].R=M+a;
  29. }
  30. sort(s+1,s+m+1,cmp);
  31. double res=0.0,mx=-INF;
  32. for (int i=1;i<=m;i++)
  33. if (s[i].L>mx)
  34. res+=s[i].R-s[i].L,mx=s[i].R;
  35. else if (s[i].R>mx)
  36. res+=s[i].R-mx,mx=s[i].R;
  37. return res;
  38. }
  39. double Simpson(double a,double b,double Fa,double Fb,double Fab){
  40. return (b-a)/6*(Fa+Fab*4+Fb);
  41. }
  42. double Asr(double a,double b,double v,double Fa,double Fb,double Fab){
  43. double ab=(a+b)/2;
  44. double LFab=F((a+ab)/2),L=Simpson(a,ab,Fa,Fab,LFab);
  45. double RFab=F((ab+b)/2),R=Simpson(ab,b,Fab,Fb,RFab);
  46. if (fabs(v-L-R)<Eps)
  47. return v;
  48. return Asr(a,ab,L,Fa,Fab,LFab)
  49. +Asr(ab,b,R,Fab,Fb,RFab);
  50. }
  51. int killed[N];
  52. double Dis(double x1,double y1,double x2,double y2){
  53. return sqrt(sqr(x1-x2)+sqr(y1-y2));
  54. }
  55. int main(){
  56. scanf("%d",&n);
  57. double a=INF,b=-INF;
  58. for (int i=1;i<=n;i++){
  59. scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);
  60. a=min(a,c[i].x-c[i].r);
  61. b=max(b,c[i].x+c[i].r);
  62. }
  63. sort(c+1,c+n+1,cmpr);
  64. for (int i=1;i<=n;i++)
  65. for (int j=i+1;j<=n;j++)
  66. if (Dis(c[i].x,c[i].y,c[j].x,c[j].y)+c[j].r<c[i].r+Eps)
  67. killed[j]=1;
  68. int _n=0;
  69. for (int i=1;i<=n;i++)
  70. if (!killed[i])
  71. c[++_n]=c[i];
  72. n=_n;
  73. double ans=0;
  74. for (double x=a;x<b;x++){
  75. for (int i=1;i<=n;i++)
  76. _c[i]=c[i];
  77. int _n=n;
  78. n=0;
  79. for (int i=1;i<=_n;i++)
  80. if (c[i].x-c[i].r<i+1&&c[i].x+c[i].r>i)
  81. c[++n]=_c[i];
  82. n=_n;
  83. for (int i=1;i<=n;i++)
  84. c[i]=_c[i];
  85. double Fa=F(x),Fb=F(x+1),Fab=F((x+x+1)/2);
  86. ans+=Asr(x,x+1,Simpson(x,x+1,Fa,Fb,Fab),Fa,Fb,Fab);
  87. }
  88. printf("%.3lf",ans);
  89. return 0;
  90. }

  

BZOJ2178 圆的面积并 计算几何 辛普森积分的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj2178: 圆的面积并

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

  6. [BZOJ 2178] 圆的面积并 【Simpson积分】

    题目链接:BZOJ - 2178 题目分析 用Simpson积分,将圆按照 x 坐标分成连续的一些段,分别用 Simpson 求. 注意:1)Eps要设成 1e-13  2)要去掉被其他圆包含的圆. ...

  7. bzoj 2178 圆的面积并【simpson积分】

    直接套simpson,f可以直接把圆排序后扫一遍所有圆,这样维护一个区间就可以避免空段. 然而一定要去掉被其他圆完全覆盖的圆,否则会TLE #include<iostream> #incl ...

  8. BZOJ 2178: 圆的面积并 [辛普森积分 区间并]

    2178: 圆的面积并 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1740  Solved: 450[Submit][Status][Discus ...

  9. bzoj 2178 圆的面积并 —— 辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 先看到这篇博客:https://www.cnblogs.com/heisenberg- ...

随机推荐

  1. Linux mem/swap/buffers/cached 区别

    Free free 命令相对于top 提供了更简洁的查看系统内存使用情况: $ free total used free shared buffers cached Mem: 255268 23833 ...

  2. mac 上如何安装非app store上的下载的软件-------打开未知来源

    打开了 Terminal 终端后 ,在命令提示后输入 sudo spctl --master-disable 并按下回车执行,如下图所示.   随后再输入当前 Mac 用户的密码,如下图所示.   如 ...

  3. cocos2dx-lua控制台报错集合

    1.invalid 'cobj' in function 'lua_cocos2dx_Node_getLocalZOrder' 这个报错是lua的变量还在,但是他底层对应的C++对象已被销毁.

  4. 判断iOS版本号

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {  }

  5. Modbus库开发笔记之十:利用协议栈开发Mosbus RTU Slave应用

    上一节我们使用协议占开发了一个Modbus TCP Server应用.接下来我们使用协议栈在开发一个基于串行链路的Mosbus RTU Slave应用. 根据前面对协议栈的封装,我们需要引用Modbu ...

  6. WebSocket异步通讯,实时返回数据

    第一种方式 // 服务端: //var listener = new HttpListener(); // listener.Prefixes.Add("http://*:8080/&quo ...

  7. Confluence 6 在数据源连接中启用校验查询

    确定 Confluence 在数据库连接池中校验数据库连接: 停止 Confluence. 编辑 <installation-directory>/conf/server.xml 文件(或 ...

  8. Java之动手动脑(三)

    日期:2018.10.12 星期五 博客期:017 这次留了两个动手动脑作业!我需要一个一个来说!先说第一个吧! Part 1 :随机生成1000个随机数 代码: //以下为 RandomMaker. ...

  9. kafka消息的分发与消费

    关于 Topic 和 Partition: Topic: 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合.每条消息发送到 kafka 集群的消息都有一个类别.物理上来 ...

  10. java.io几种读写文件的方式

    一.Java把这些不同来源和目标的数据都统一抽象为数据流. Java语言的输入输出功能是十分强大而灵活的. 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作 ...