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 4003 Find Metal Mineral 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...
- 查看Centos系统信息命令
linux命令行具有强大的功能,我们安装vps后,首先应该知道系统信息,查看这些信息,你会发现Linux命令很简单,你可以按照下面的命令练习. linux系统信息 # uname -a # 查看内核/ ...
- Coding4Fun.Phone.Controls的使用
Coding4Fun.Phone.Controls的使用: windows phone的应用一直有一个特色,那就是方块(磁贴).之前的应用中,我一直都XXXX 来实现,原来其实一直有一个更加好的方法, ...
- C编译错误解决方法
1.expected identifier before numeric constant 一般情况下是枚举类型中的某个变量已经被#define定义过一次了,在项目空间中搜索你枚举类型中的所有变量类型 ...
- Linuxshell脚本之if条件判断
IF条件判断 .基本语法: if [ command ]; then 符合该条件执行的语句 fi .扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comman ...
- http status 汇总
http status 汇总 常见HTTP状态码 200 OK 301 Moved Permanently 302 Found 304 Not Modified 307 Temporary Redir ...
- POJ 2080
import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...
- login shell 和 non-login shell 的区别
介绍之前先思考一个问题:有时我们通过su命令切换用户后,却发现并没有进入该用户的shell环境.这是为什么? login shell:取得bash时需要完整的登录流程.就是说通过输入账号和密码登录系统 ...
- 定时每天执行前一天的数据导入oracle
#!/bin/bash export LANG="en_US.UTF-8" #设定时间变量,为前一天时间 log_date=`date +%Y-%m-%d -d "-1 ...
- gitHub入门指导
Github可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个项目贡 ...