HDU 4752 Polygon
2014-05-26 17:38
253 查看
#include "cstdio" #include "cmath" #include "iostream" #include "algorithm" using namespace std; #define EPS 1e-8 double a,b,c; double l,r; double f(double x){ return sqrt((2.*a*x+b)*(2.*a*x+b)+1); } double f2(double x){ return a*x*x+b*x+c; } double simpson(double a,double b){ double c=a+(b-a)/2.; return (f(a)+4.*f(c)+f(b))*(b-a)/6.; } double asr(double a,double b,double eps,double A){ double c=a+(b-a)/2.; double L=simpson(a,c),R=simpson(c,b); if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15.; return asr(a,c,eps/2,L)+asr(c,b,eps/2,R); } double solve(double a,double b,double eps){ return asr(a,b,eps,simpson(a,b)); } struct point{ double x,y; }save[20005]; double inse[20005]; int cnt; void findinsert(point p,point q){ double ta=p.y-q.y,tb=q.x-p.x,tc=p.x*q.y-q.x*p.y; double x1,x2; if(fabs(tb-0.)<1e-10){ x1=-tc/ta; if((x1-p.x)*(x1-q.x)<=EPS&&(x1-l)*(x1-r)<=EPS&&((f2(x1)-p.y)*(f2(x1)-q.y))<=EPS){ inse[cnt++]=x1; //printf("%lf %lf\n",x1,f2(x1)); } return; } double tk=-ta/tb,ttb=-tc/tb; double delta=(b-tk)*(b-tk)-4*a*(c-ttb); if(delta<-EPS) return; x1=(tk-b+sqrt(delta))/(2.*a),x2=(tk-b-sqrt(delta))/(2.*a); //printf("%lf %lf %lf %lf\n",p.x,q.x,x1,x2); if((x1-p.x)*(x1-q.x)<=EPS) inse[cnt++]=x1; if((x2-p.x)*(x2-q.x)<=EPS) inse[cnt++]=x2; } double len(double x) { double t,tt; t=(sqrt((b+2*a*x)*(b+2*a*x)+1)+2*a*x+b); tt=log(t)/(4*a); t=sqrt((b+2*a*x)*(b+2*a*x)+1)*(b+2*a*x)/(4*a); tt+=t; return tt; } int main(){ int n; while(scanf("%d%lf%lf%lf%lf%lf",&n,&a,&b,&c,&l,&r)!=EOF){ double ans=0.; for(int i=0;i<n;i++) scanf("%lf%lf",&save[i].x,&save[i].y); if(n<3){ printf("0.00\n"); continue; } save =save[0]; for(int i=0;i<n;i++){ if(save[i].x!=save[i+1].x){ double x1=save[i].x,x2=save[i+1].x; double y1=save[i].y,y2=save[i+1].y; if(x1>x2){ swap(x1,x2); swap(y1,y2); } double k=(y2-y1)/(x2-x1); double d=y1-k*x1; double delta=(b-k)*(b-k)-4.*a*(c-d); double length=0.; if(delta>=0) { double t1=(-(b-k)*1.0+sqrt(delta))/(2.0*a); double t2=(-(b-k)*1.0-sqrt(delta))/(2.0*a); if(t1>t2)swap(t1,t2); t1=max(x1,max(t1,l*1.0)); t2=min(x2,min(t2,r*1.0)); if(t1<=t2) length=fabs(len(t2)-len(t1)); if(save[i].x<save[i+1].x)ans+=length; else ans-=length; } } } /* cnt=0; for(int i=0;i<n;i++){ if(save[i].x!=save[(i+1)%n].x) findinsert(save[i],save[(i+1)%n]); } //for(int i=0;i<cnt;i++) printf("%lf ",inse[i]); //printf("\n"); sort(inse,inse+cnt); for(int i=0;i<cnt;i+=2){ if(inse[i+1]<l) continue; if(inse[i]>r) break; ans+=solve(max(inse[i],l),min(inse[i+1],r),1e-6); }*/ printf("%.2lf\n",fabs(ans)); } return 0; }
相关文章推荐
- HDU 4752 Polygon(抛物线长度积分)
- HDU 4752 Polygon
- hdu 1154 Cutting a Polygon (Simple Geometry)
- Regular polygon HDU - 6055
- HDU 4752
- hdu 1154 poj 2462 Cutting a polygon 计算几何
- hdu 4752
- HDU 1154 Cutting a Polygon(基础计算几何知识综合应用)
- HDU-2007 Scrambled Polygon 极角排序
- Regular polygon HDU 6055
- HDU 4195 Regular Convex Polygon(正多边形)
- hdu - 4159 - Regular Convex Polygon - 精度问题
- hdu-1154 Cutting a Polygon(计算几何综合应用,多模板)
- HDU 1251 统计难题 字典树
- hdu 2845 Beans
- hdu 1028 DP 完全背包
- HDU 1162 Eddy's picture Kruskal算法
- hdu 3791 二叉查找树
- hdu4143
- hdu 4611 Balls Rearrangement 多校第二场