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

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

___________________________

BZOJ2178

#include <cstdio>
#include <cmath>
#include <algorithm>
#define LDB double
using namespace std; const LDB eps=1e-;
LDB ans=; struct data{
LDB x,y,r,va;
}a[],tmp[]; int st,en,n,del[]; int mycomp (const data&a,const data&b){
return(a.va<b.va);
} LDB dis(data a,data b){
return(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
} LDB getf(LDB xx){
int cnt=;
for (int i=st;i<=en;i++)
if (fabs(a[i].x-xx)<a[i].r-eps){
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));
}
sort(tmp+,tmp+cnt+,mycomp); LDB ret=;int po;
for (int i=;i<=cnt;i=po+){
po=i;LDB last=*tmp[i].y-tmp[i].va;
while (po<cnt&&tmp[po+].va<last){
po++;
last=max(last,*tmp[po].y-tmp[po].va);
}
ret+=(last-tmp[i].va);
}
return(ret);
} LDB cal(LDB l,LDB r,LDB fl,LDB fmid,LDB fr){
return((r-l)*(fl+*fmid+fr)/);
} void simpson(LDB l,LDB r,LDB fl,LDB fmid,LDB fr){
LDB mid=(l+r)/;
LDB mid1=(l+mid)/,mid2=(mid+r)/;
LDB f1=getf(mid1),f2=getf(mid2);
LDB num1=cal(l,r,fl,fmid,fr);
LDB num2=cal(l,mid,fl,f1,fmid)+cal(mid,r,fmid,f2,fr);
if (fabs(num1-num2)<eps) {ans+=num1;return;}
simpson(l,mid,fl,f1,fmid);simpson(mid,r,fmid,f2,fr);
} void work(){
int po;LDB last;
for (int i=;i<=n;i=po+){
po=i,last=a[i].x+a[i].r;
while (po<n&&a[po+].x-a[po+].r<last+eps){
po++;
last=max(last,a[po].x+a[po].r);
}
st=i;en=po;
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));
}
} int main(){
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%lf%lf%lf",&tmp[i].x,&tmp[i].y,&tmp[i].r);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (i!=j)
if (dis(tmp[i],tmp[j])<tmp[j].r-tmp[i].r) {del[i]=;break;}
int cnt=;
for (int i=;i<=n;i++)
if (!del[i]) a[++cnt]=tmp[i],a[cnt].va=a[cnt].x-a[cnt].r;
n=cnt;
sort(a+,a+n+,mycomp); work();
printf("%.3lf\n",ans);
}

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. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  2. iOS: 为画板App增加 Undo/Redo(撤销/重做)操作

    这个随笔的内容以上一个随笔为基础,(在iOS中实现一个简单的画板),上一个随笔实现了一个简单的画板:   今天我们要为这个画板增加Undo/Redo操作,当画错了一笔,可以撤销它,或者撤销之后后悔了, ...

  3. [Tool] 插入折叠区域功能

    之前写了一个 仿博客园网页端推荐的插入代码插件, 后来在总结一些技术文档时,总是想把一些属性或者方法,参数等,都用表格的形式清晰的列举出来,但是插入的表格太大的话,上下跨度就显得特别大,来回上下滚动的 ...

  4. CentOS 6.7 如何启用中文输入法

    安装CentOS系统后,如何启用中文输入法呢?这个问题看起来简单,但对于Linux初学者来说,也可能不是一件容易的事.本文笔者和大家分享一下"CentOS 6.6 如何启用中文输入法&quo ...

  5. .NET Core 2.0版本预计于2017年春季发布

    英文原文: NET Core 2.0 Planned for Spring 2017 微软项目经理 Immo Landwerth 公布了即将推出的 .NET Core 2.0 版本的细节,该版本预计于 ...

  6. angular $http请求

    angular使用post.get向后台传参的问题 一.问题的来源 我们都知道向后台传参可以使用get.put,其形式就类似于name=jyy&id=001.但是在ng中我却发现使用$http ...

  7. JS高程4.变量,作用域和内存问题(3)垃圾收集

    JavaScript的自动垃圾收集机制 执行环境会负责管理代码执行过程中使用的内存,编写JavaScript程序时,所需内存的分配以及无用内存的回收完全实现自动管理. 原理: 找出那些不再继续使用的变 ...

  8. sql case when...then...else...end 选择判断

    达到的需求为: 吓数收回日期为空:当接单日期不等于空和当天减接单日期大于3天时,为1,否则为0:当接单日期为空.最大发织交期不等于空和当天减去最大发织交期大于3天时,为1,否则为0:当接单日期和发织交 ...

  9. EasyUI+Knockout实现经典表单的查看、编辑

    此文章是基于 1. 搭建SpringMVC+Spring+Hibernate平台 2. 自制xml实现SQL动态参数配置 3. 利用DetachedCriteria构建HQL参数动态匹配 4. 常用日 ...

  10. node.js express安装及示例网站搭建

    1.首先肯定是要安装Node.JS windows cmd依次输入如下命令: cd C:\Program Files\nodejs\ npm install -g expressnpm install ...