HDU 4752 Polygon(抛物线长度积分)
题目链接: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(抛物线长度积分)的更多相关文章
- hdu 4969 Just a Joke(积分)
题目链接:hdu 4969 Just a Joke 题目大意:Guizeyanhua要去追一个女孩,女孩在以Guizeyanhua为圆心,半径为R的圆上匀速运动,女孩的速度为v1,Guizeyanhu ...
- hdu 1724 Ellipse —— 自适应辛普森积分
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1724 函数都给出来了,可以用辛普森积分: 一开始 eps = 1e-8 TLE了,答案只要三位小数,那么 ...
- HDU 1724 Ellipse (自适应辛普森积分)
题目链接:HDU 1724 Problem Description Math is important!! Many students failed in 2+2's mathematical tes ...
- hdu 4033Regular Polygon(二分+余弦定理)
Regular Polygon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)T ...
- HDU 3668 Volume (数学,积分)
题意:求图中交叉圆柱体的体积! 析:大体思路很明确,把两个圆柱的体积加起来 减去中间公共部分的即可!第一步首先得想到公共部分是一个怎样的图形.这个在高数下册例题中有讲到! 中间实线部分就是第一卦限内的 ...
- hdu 4752
计算几何+数值计算的题目: 要用到辛普森积分,没有学过~~~ 参考学习了acm_Naruto大神 的代码! 代码: #include<cstdio> #include<cmath&g ...
- HDU 1724 Ellipse 自适应simpson积分
simpson公式是用于积分求解的比较简单的方法(有模板都简单…… 下面是simpson公式(很明显 这个公式的证明我并不会…… (盗图…… 因为一段函数基本不可能很规则 所以我们要用自适应积分的方法 ...
- hdu 5826 physics (物理数学,积分)
physics Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 3191 次短路长度和条数
http://www.cnblogs.com/wally/archive/2013/04/16/3024490.html http://blog.csdn.net/me4546/article/det ...
随机推荐
- hdu 4004 The Frog's Games
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4004 The annual Games in frogs' kingdom started again ...
- ios 获取n个月前或者n个月后的日期
NSCalendar *calendar = [NSCalendar currentCalendar]; NSRange range = [calendar rangeOfUnit:NSDayCale ...
- KIP-32 Add timestamps to Kafka message
通过KIP32,Kafka的每条消息都加进了时间戳,这个KIP在0.10.0.0被加入. 说到“时间”,先贴张图,娱乐一下(如果对星球大战系列电影不熟的话,请自动略过……) 这个KIP的文档在 KIP ...
- 利用excel数据透视表实现快速统计相关数据
昨天ytkah在做数据报表时需要做一些具体统计数字:公司每天都有人申请铅笔.笔记本等一些文具用品,现在想要统计每天申请铅笔多少支.笔记本多少本,如下图所示,这个要如何实现呢? excel数据透视表怎么 ...
- ”sql Server2008 应用程序无法启动,因为应用程序的并行配置不正确。 找不到从属程序集。“C:\windows\SysWOW64\DTSPipelinePerf100.dll”的激活上下文生成失败“的解决方案
一:控制面板->管理工具->事件查看器->windows日志->应用程序 查看错误原因: 二:在其他机子上拷贝一个DTSWizard.exe.config文件替换本机上已经 ...
- Extjs利用vtype验证表单
Ext.create('Ext.form.Panel', { title: '表单验证', renderTo: Ext.getBody(), frame ...
- HDU4010 Query on The Trees(LCT)
人生的第一道动态树,为了弄懂它的大致原理,需要具备一些前置技能,如Splay树,树链剖分的一些概念.在这里写下一些看各种论文时候的心得,下面的代码是拷贝的CLJ的模板,别人写的模板比较可靠也方便自己学 ...
- POJ 2923 Relocation (状态压缩,01背包)
题意:有n个(n<=10)物品,两辆车,装载量为c1和c2,每次两辆车可以运一些物品,一起走.但每辆车物品的总重量不能超过该车的容量.问最少要几次运完. 思路:由于n较小,可以用状态压缩来求解. ...
- Activity学习(五)——Bundle机制
上一篇文章我简单介绍了Activity之间简单切换,很简单,这一篇文章我们继续聊Android中程序页面互相跳转的Activity,不过这一次我们在Activity跳转时,携带一些简单的数据,然后在新 ...
- 用C#读取,写入ini文件
[DllImport("kernel32.dll")] private static extern bool WritePrivateProfileString(string se ...