使用二次函数拟合复杂的连续函数求积分

对于(l,r)拟合的积分为(r-l)*(f(l)+4*f((l+r)/2)+f(r))/6

___________________________

BZOJ2178

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #define LDB double
  5. using namespace std;
  6.  
  7. const LDB eps=1e-;
  8. LDB ans=;
  9.  
  10. struct data{
  11. LDB x,y,r,va;
  12. }a[],tmp[];
  13.  
  14. int st,en,n,del[];
  15.  
  16. int mycomp (const data&a,const data&b){
  17. return(a.va<b.va);
  18. }
  19.  
  20. LDB dis(data a,data b){
  21. return(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
  22. }
  23.  
  24. LDB getf(LDB xx){
  25. int cnt=;
  26. for (int i=st;i<=en;i++)
  27. if (fabs(a[i].x-xx)<a[i].r-eps){
  28. tmp[++cnt]=a[i];tmp[cnt].va=a[i].y-sqrt(a[i].r*a[i].r-(a[i].x-xx)*(a[i].x-xx));
  29. }
  30. sort(tmp+,tmp+cnt+,mycomp);
  31.  
  32. LDB ret=;int po;
  33. for (int i=;i<=cnt;i=po+){
  34. po=i;LDB last=*tmp[i].y-tmp[i].va;
  35. while (po<cnt&&tmp[po+].va<last){
  36. po++;
  37. last=max(last,*tmp[po].y-tmp[po].va);
  38. }
  39. ret+=(last-tmp[i].va);
  40. }
  41. return(ret);
  42. }
  43.  
  44. LDB cal(LDB l,LDB r,LDB fl,LDB fmid,LDB fr){
  45. return((r-l)*(fl+*fmid+fr)/);
  46. }
  47.  
  48. void simpson(LDB l,LDB r,LDB fl,LDB fmid,LDB fr){
  49. LDB mid=(l+r)/;
  50. LDB mid1=(l+mid)/,mid2=(mid+r)/;
  51. LDB f1=getf(mid1),f2=getf(mid2);
  52. LDB num1=cal(l,r,fl,fmid,fr);
  53. LDB num2=cal(l,mid,fl,f1,fmid)+cal(mid,r,fmid,f2,fr);
  54. if (fabs(num1-num2)<eps) {ans+=num1;return;}
  55. simpson(l,mid,fl,f1,fmid);simpson(mid,r,fmid,f2,fr);
  56. }
  57.  
  58. void work(){
  59. int po;LDB last;
  60. for (int i=;i<=n;i=po+){
  61. po=i,last=a[i].x+a[i].r;
  62. while (po<n&&a[po+].x-a[po+].r<last+eps){
  63. po++;
  64. last=max(last,a[po].x+a[po].r);
  65. }
  66. st=i;en=po;
  67. simpson(a[i].x-a[i].r,last,getf(a[i].x-a[i].r),getf((a[i].x-a[i].r+last)/),getf(last));
  68. }
  69. }
  70.  
  71. int main(){
  72. scanf("%d",&n);
  73. for (int i=;i<=n;i++) scanf("%lf%lf%lf",&tmp[i].x,&tmp[i].y,&tmp[i].r);
  74. for (int i=;i<=n;i++)
  75. for (int j=;j<=n;j++)
  76. if (i!=j)
  77. if (dis(tmp[i],tmp[j])<tmp[j].r-tmp[i].r) {del[i]=;break;}
  78. int cnt=;
  79. for (int i=;i<=n;i++)
  80. if (!del[i]) a[++cnt]=tmp[i],a[cnt].va=a[cnt].x-a[cnt].r;
  81. n=cnt;
  82. sort(a+,a+n+,mycomp);
  83.  
  84. work();
  85. printf("%.3lf\n",ans);
  86. }

simpson的更多相关文章

  1. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: 562[Submit][Status] ...

  2. 农场阳光 (simpson)

    计算若干个圆与一个矩形的面积并 simpson公式 ans = ( f[l] + f[r] + 4 * f[mid] ) * (r-l) / 6 uses math; type arr=record ...

  3. BZOJ 1502 月下柠檬树(simpson积分)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1502 题意:给出如下一棵分层的树,给出每层的高度和每个面的半径.光线是平行的,与地面夹角 ...

  4. UVa 10465 Homer Simpson (枚举)

    10465 - Homer Simpson Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onli ...

  5. 10465 - Homer Simpson 贪心

                                            Homer Simpson Time Limit: 3 seconds Memory Limit: 32 MB Home ...

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

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

  7. [BZOJ 1502] [NOI2005] 月下柠檬树 【Simpson积分】

    题目链接: BZOJ - 1502 题目分析 这是我做的第一道 Simpson 积分的题目.Simpson 积分是一种用 (fl + 4*fmid + fr) / 6 * (r - l) 来拟合 fl ...

  8. UVA 10465 Homer Simpson(dp + 完全背包)

    Problem C: Homer Simpson Time Limit: 3 seconds Memory Limit: 32 MB Homer Simpson, a very smart guy, ...

  9. hdu 1724 Ellipse simpson积分

    /* hdu 1724 Ellipse simpson积分 求椭圆的部分面积 simpson积分法 http://zh.wikipedia.org/zh-tw/%E8%BE%9B%E6%99%AE%E ...

随机推荐

  1. iOS: 在iPhone和Apple Watch之间共享数据: App Groups

    我们可以在iPhone和Apple Watch间通过app groups来共享数据.方法如下: 首先要在dev center添加一个新的 app group: 接下来创建一个新的single view ...

  2. 利用rebase来压缩多次提交

    我们可以用Git merge –squash来将分支中多次提交合并到master后,只保留一次提交历史.但是有些提交到github远程仓库中的commit信息如何合并呢? 历史记录 首先我们查看一下m ...

  3. Navisworks Api Quantification

    Quantification  国外有的叫定量  我们国内一些施工方叫工程量. 通过TakeOff API的开发者有机会获得更多的数据和数据可通过图形用户界面. 1 添加Navisworks的Api ...

  4. 设计模式(十四)模板方法模式(Template Pattern)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  5. 【夯实PHP基础】php开发时遇到白页的调试方法

    本文地址   分享提纲: 1. 设置报错报错级别,显示报错 2. 白页的可能原因     1.[设置报错报错级别,显示报错] php开发时,访问地址也对,但就是不出来页面,显示的是 白的页面,所以就可 ...

  6. ASP.NET MVC搭建项目后台UI框架—1、后台主框架

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  7. dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】

    最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我 ...

  8. java静态修饰符static的使用

    class Person { private String name; private int age; /* * 假设每个Person对象的国籍都一样, * 那么每次调用都要赋值就会不合理. * 使 ...

  9. iOS 对模型对象进行归档

    归档是指一种形式的序列化,专门编写用于保存数据的任何对象都应该支持归档.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们. 只要在类中实现的每个属性都是标量或者都是遵循NS ...

  10. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...