【xsy1775】数值积分

题意

多组询问,求\(\int_l^r\sqrt{a(1-{x^2\over b})}dx\)

分析

double f(double x) {
    return sqrt(a*(1-x*x/b));
}

double Get(double l,double r) {
    return (r-l)*(f(l)+f(r)+4*f((l+r)/2))/6;
}

double Calc(double l,double r) {
    double gx=Get(l,r);
    double mid=(l+r)/2,gl=Get(l,mid),gr=Get(mid,r),gs=gl+gr;
    if (!cmp(gx-gs))
        return gs;
    else {
        double rl=Calc(l,mid),rr=Calc(mid,r),rs=rl+rr;
        return rs;
    }
}

【bzoj2178】圆的面积并

//...

int cmp(double x);

int n,flag[N];
struct Cir {
    int x,y,r;
    Cir(int _x=0,int _y=0,int _r=0) {
        x=_x,y=_y,r=_r;
    }
    friend int operator < (Cir a,Cir b) {
        return a.r<b.r;
    }
}cir[N];

int tot;
struct Line {
    double l,r;
    Line(double _l=0,double _r=0) {
        l=_l,r=_r;
    }
    friend int operator < (Line a,Line b) {
        return cmp(a.l-b.l)<0;
    }
}line[N];

double res;

//...

int cmp(double x) {
    if (fabs(x)<EPS) return 0;
    return x<0?-1:1;
}

int Contain(Cir a,Cir b) {
    int dx=a.x-b.x,dy=a.y-b.y,dr=a.r-b.r;
    return dx*dx+dy*dy<=dr*dr;
}

#define ld double
#define get f
#define F rep
#define p line
#define segment Line
#define eps EPS
#define a cir
#define inf 1e9
inline bool cmp2(segment a,segment b) {
    return a.l<b.l;
}
inline ld get(ld x) {
    int cnt=0;
    F(i,1,n) if (cmp(fabs(x-a[i].x)-a[i].r)<=0) {
        ld tmp=sqrt(pow(a[i].r,2)-pow(x-a[i].x,2));
        if (!cmp(tmp)) continue;
        p[++cnt]=(segment) {
            a[i].y-tmp,a[i].y+tmp
        };
    }
    sort(p+1,p+cnt+1,cmp2);

    /*
    ld h=-inf,ans=0;
    F(i,1,cnt) {
        if (h<p[i].l) ans+=p[i].r-p[i].l,h=p[i].r;
        else if (h<p[i].r) ans+=p[i].r-h,h=p[i].r;
    }
    return ans;
    */

    double totLen=0,mxp=MIN;
    rep(i,1,cnt) {
//      if (cmp(line[i].r-mxp)<=0) continue;
        if (mxp<p[i].l/*cmp(line[i].l-mxp)>0*/)
            totLen+=line[i].r-line[i].l,mxp=line[i].r;
        else if (mxp<p[i].r/*cmp(mxp-p[i].r)<0*/)
            totLen+=line[i].r-mxp,mxp=line[i].r;
//      mxp=line[i].r;
    }
    return totLen;
}
#undef ld
#undef get
#undef F
#undef p
#undef segment
#undef eps
#undef a
#undef inf

double Get(double l,double r) {
    return (r-l)*(f(l)/6+f(r)/6+f((l+r)/2)*2/3);
}

double Calc(double l,double r) {
    double gx=Get(l,r);
    double mid=(l+r)/2;
    double gl=Get(l,mid);
    double gr=Get(mid,r);
    double gs=gl+gr;
    if (!cmp(gx-gs))
        return gs;
    else {
        double rl=Calc(l,mid);
        double rr=Calc(mid,r);
        double rs=rl+rr;
        return rs;
    }
}

int main(void) {
    //...

    sort(cir+1,cir+n+1);
    rep(i,1,n) rep(j,i+1,n)
        if (Contain(cir[j],cir[i])) {
            flag[i]=1;
            break;
        }
    int cur=0;
    rep(i,1,n) if (!flag[i])
        cir[++cur]=cir[i];
    n=cur;

    res=Calc(L,R);
    printf("%.3lf\n",res);

    //...
}

小结

对于这类求面积的问题,意味着它满足连续性,可以使用积分来求解。

【hdu1724】Ellipse

double f(double x) {
    double y2=(1-pow(x,2)/pow(a,2))*pow(b,2);
    if (cmp(y2)<0) return 0; else return 2*sqrt(y2);
}

double Get(double l,double r) {
    return (r-l)*(f(l)+f(r)+4*f((l+r)/2))/6;
}

double Calc(double l,double r) {
    double mid=(l+r)/2;
    double gl=Get(l,mid);
    double gr=Get(mid,r);
    double gs=Get(l,r);
    if (!cmp(gs-(gl+gr)))
        return gl+gr;
    else {
        double rl=Calc(l,mid);
        double rr=Calc(mid,r);
        return rl+rr;
    }
}

simpson法求积分 专题练习的更多相关文章

  1. 【编程练习】收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等

    写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...

  2. 之前写的收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等

    写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...

  3. 复化梯形求积分——用Python进行数值计算

    用程序来求积分的方法有很多,这篇文章主要是有关牛顿-科特斯公式. 学过插值算法的同学最容易想到的就是用插值函数代替被积分函数来求积分,但实际上在大部分场景下这是行不通的. 插值函数一般是一个不超过n次 ...

  4. 自适应Simpson法与积分初步

    前言 不知道为什么,今天感觉想要写一下数学的东西,然后就看了一下我还有这个模板不会,顺手写了一下. 没有学过微积分的最好还是看一下求导为好. 求导 听说很多人都不会求导,我写一下吧qwq 令\(f(x ...

  5. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  6. [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法

    关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...

  7. C语言实现快速排序法(分治法)

    title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...

  8. 洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)

    题面 传送门 题解 我还好奇自适应辛普森法干嘛用的呢--突然想起来积分的一个用处就是求曲边图形的面积-- 我们先来考虑一下这些投影是什么形状 一个圆的投影还是它自己 一个圆锥的投影是一个圆加上一个点, ...

  9. 在线倍增法求LCA专题

    1.cojs 186. [USACO Oct08] 牧场旅行 ★★   输入文件:pwalk.in   输出文件:pwalk.out   简单对比时间限制:1 s   内存限制:128 MB n个被自 ...

随机推荐

  1. js中子父页面数据传递与方法调用

    A父页面 ,B为子页面 1.父页面调用子页面 A中调用B中方法:self.frames[iframeName].BFunction(); 注:iframeName:为父页面中iframe的name属性 ...

  2. 就最近学习MVC4.0的页面用法学到的东西

    最近进了一家新公司,学习的东西还是蛮多的,首先了解的是@using(new Ajax.beginForm("",null,new AjaxOptions() { OnSuccess ...

  3. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  4. 在Eclipse下搭建Android开发环境教程

    我们昨天向各位介绍了<在NetBeans上搭建Android SDK环境>,前不久也介绍过<在MyEclipse 8.6上搭建Android开发环境>, 都受到了读者的欢迎.但 ...

  5. HTTP标头

    HTTP头信息 头信息由“键:值”组成.它们描述客户端或者服务器的属性.被传输的资源以及应该实现连接. 四种不同类型的头标 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关 ...

  6. JavaScript---function、this关键字相关习题

    1. 请看下列代码: function F( ){ function C( ){ return this; } return C(); } var o=new F( ); 请问上面的this值指向的是 ...

  7. 《编写可维护的JavaScript》——JavaScript编码规范(一)

    缩进层级 代码如何缩进通常有两种主张: 使用制表符缩进 每一个缩进层级都用单独的制表符表示.这种方法的主要缺点是:系统对制表符的解释不一致.这些差异会导致不同的开发者对同一段代码有不同的看法的,这正是 ...

  8. 空格哥的第一篇Blog

    首先十分感谢博客园在这里给我的平台,我在这里学习到了很多东西,响应的,我也想要在这里记录下自己的心路历程!在学习的过程中,希望博客园一直陪伴我,小弟在这里不胜感激!这是小弟的第一篇博客,很多东西都不是 ...

  9. mysql 链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES))

    mysql链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)) 修改: # ...

  10. usr类库的使用(一般用在第三方类库使用系统库报错头文件找不到时)

    第三方Html解析类库Hpple,在导入框架libxml2.2.dylib后,XCode仍然找不到<libxml/tree.h>. 1 .项目 -Targets 中的 Build P ha ...