题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4752

题意:给出一个抛物线和一个简单多边形。求抛物线在多边形内部的长度。

思路:首先求出多边形所有边和抛物线的交点。这里要注意:

(1)边和抛物线相切不算,因为整个抛物线在边的另一侧;

(2)如下,上面两种相交都是不能算的,下面一种要算。

算出所有交点之后,那么每相邻两个交点与抛物线的关系必然是抛物线交替进入-离开。下面对于一段[x1,x2]计算抛物线的长度。

struct point
{
    double x,y;

    void get()
    {
        cin>>x>>y;
    }

    point(){}
    point(double _x,double _y)
    {
        x=_x;
        y=_y;
    }

    point operator+(point a)
    {
        return point(x+a.x,y+a.y);
    }

    point operator-(point a)
    {
        return point(x-a.x,y-a.y);
    }

    point operator*(double t)
    {
        return point(x*t,y*t);
    }
};

point p[N];
int n;
double L,R,a,b,c;

int sgn(double x)
{
    if(x>1e-8) return 1;
    if(x<-1e-8) return -1;
    return 0;
}

vector<double> V;

double func(double x)
{
    return a*x*x+b*x+c;
}

void deal(point p,point q)
{

    if(sgn(p.x-q.x)==0)
    {
        double y=func(p.x);
        if(p.y>q.y) swap(p,q);
        if(sgn(y-p.y)>0&&sgn(y-q.y)<0) V.pb(p.x);
        return;
    }

    double k=(q.y-p.y)/(q.x-p.x);
    double A=a;
    double B=b-k;
    double C=c+k*p.x-p.y;
    double temp=B*B-4*A*C;
    if(sgn(temp)<=0) return;
    temp=sqrt(temp);
    double x1=(-B-temp)/(2*A);
    double x2=(-B+temp)/(2*A);
    if(p.x>q.x) swap(p,q);
    if(sgn(x1-p.x)>0&&sgn(x1-q.x)<0) V.pb(x1);
    if(sgn(x2-p.x)>0&&sgn(x2-q.x)<0) V.pb(x2);
}

void deal(point p1,point p,point p2)
{
    if(sgn(func(p.x)-p.y)) return;
    p1=p+(p1-p)*1e-3;
    p2=p+(p2-p)*1e-3;
    if(sgn(func(p1.x)-p1.y)*sgn(func(p2.x)-p2.y)==-1) V.pb(p.x);
}

double cal(double x)
{
    double A=4*a*a;
    double B=4*a*b;
    double C=b*b+1;

    double temp=A*x*x+B*x+C;
    return (2*A*x+B)/(4*A)*sqrt(temp)+(4*A*C-B*B)/(8*A*sqrt(A))*log(fabs(2*A*x+B+2*sqrt(A)*sqrt(temp)));
}

double cal(double l,double r)
{
    if(l<L) l=L;
    if(r>R) r=R;
    if(l>=r) return 0;
    return cal(r)-cal(l);
}

int main()
{
    Rush(n)
    {
        scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&L,&R);
        int i;
        FOR0(i,n) p[i].get();
        p[n]=p[0]; p[n+1]=p[1];
        V.clear();
        FOR0(i,n) deal(p[i],p[i+1]);
        FOR1(i,n) deal(p[i-1],p[i],p[i+1]);
        sort(V.begin(),V.end());
        double ans=0;
        for(i=0;i+1<SZ(V);i+=2) ans+=cal(V[i],V[i+1]);
        PR(ans);
    }
}

  

HDU 4752 Polygon(抛物线长度积分)的更多相关文章

  1. hdu 4969 Just a Joke(积分)

    题目链接:hdu 4969 Just a Joke 题目大意:Guizeyanhua要去追一个女孩,女孩在以Guizeyanhua为圆心,半径为R的圆上匀速运动,女孩的速度为v1,Guizeyanhu ...

  2. hdu 1724 Ellipse —— 自适应辛普森积分

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1724 函数都给出来了,可以用辛普森积分: 一开始 eps = 1e-8 TLE了,答案只要三位小数,那么 ...

  3. HDU 1724 Ellipse (自适应辛普森积分)

    题目链接:HDU 1724 Problem Description Math is important!! Many students failed in 2+2's mathematical tes ...

  4. hdu 4033Regular Polygon(二分+余弦定理)

    Regular Polygon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)T ...

  5. HDU 3668 Volume (数学,积分)

    题意:求图中交叉圆柱体的体积! 析:大体思路很明确,把两个圆柱的体积加起来 减去中间公共部分的即可!第一步首先得想到公共部分是一个怎样的图形.这个在高数下册例题中有讲到! 中间实线部分就是第一卦限内的 ...

  6. hdu 4752

    计算几何+数值计算的题目: 要用到辛普森积分,没有学过~~~ 参考学习了acm_Naruto大神 的代码! 代码: #include<cstdio> #include<cmath&g ...

  7. HDU 1724 Ellipse 自适应simpson积分

    simpson公式是用于积分求解的比较简单的方法(有模板都简单…… 下面是simpson公式(很明显 这个公式的证明我并不会…… (盗图…… 因为一段函数基本不可能很规则 所以我们要用自适应积分的方法 ...

  8. hdu 5826 physics (物理数学,积分)

    physics Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. HDU 3191 次短路长度和条数

    http://www.cnblogs.com/wally/archive/2013/04/16/3024490.html http://blog.csdn.net/me4546/article/det ...

随机推荐

  1. 二分图匹配(KM算法)n^4 分类: ACM TYPE 2014-10-04 11:36 88人阅读 评论(0) 收藏

    #include <iostream> #include<cstring> #include<cstdio> #include<cmath> #incl ...

  2. Hdu 1009 FatMouse' Trade 分类: Translation Mode 2014-08-04 14:07 74人阅读 评论(0) 收藏

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 非阻塞式JavaScript脚本介绍

    JavaScript 倾向于阻塞浏览器某些处理过程,如HTTP 请求和界面刷新,这是开发者面临的最显著的性能问题.保持JavaScript文件短小,并限制HTTP请求的数量,只是创建反应迅速的网页应用 ...

  4. easyui 页签

    昨天开始搭后台框架,到晚上的时候遇到了一个现在觉得挺可笑但是当时一直很纠结很纠结的问题,这个问题刚刚解决出来,把它拿出来说说,让自己长点儿记性,希望大家不要犯我这个错误啊 在backstage.jsp ...

  5. mysql 数据库优化

    提到优化,先要确定出现的问题,是存储引擎选择问题,还是sql语句使用问题(如:索引)亦或者是单一存储服务器对于千万级别的数据力不从心. 解决方法:1.根据不同业务选用不同存储引擎,虽然一般情况下都优先 ...

  6. iOS第三方支付-银联支付

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "UPPayPluginDeleg ...

  7. poj 3317 Stake Your Claim 极大极小搜索

    思路:为了方便,当c1>c2时将0变为1,1变为0. 空格最多有10个,每个空格有3个状态,如果不状态压缩,会TLE的.所以最多有3^10种情况 代码如下: #include<iostre ...

  8. (4)用opengl读入off文件生成可执行文件把模型显示出来(未完待续)

    ·找了好几个程序,好像都达不到我的要求,去教程里看看吧! 在往上抛出了这问题,好几天才有人回答,我已经找到程序了 正好的他的分析对我分解程序很有用 这是一个难度比较高的 首先你要分析.off文件结构, ...

  9. Spark源码分析(三)-TaskScheduler创建

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3879151.html 在SparkContext创建过程中会调用createTaskScheduler函 ...

  10. Project Euler 110:Diophantine reciprocals II 丢番图倒数II

    Diophantine reciprocals II In the following equation x, y, and n are positive integers. For n = 4 th ...