博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

HDU.1724.Ellipse(Simpson积分)

题目链接

给定椭圆方程\(\frac{x^2}{a^2}+\frac{y^2}{b^2}=1\)\(l,r\),求\([l,r]\)区域椭圆面积。

\(y=b*sqrt(1-x^2/a^2)\),y轴两侧对称。直接用Simpson求定积分即可。
精度要高上那么几位。

//171MS	1632K
#include <cmath>
#include <cstdio>
typedef double db;

db a,b;

inline db f(db x){
	return 2*b*sqrt(1-(x/a)*(x/a));
}
inline db Simpson(db l,db r){
	return (r-l)*(f(l)+f(r)+4.0*f((l+r)*0.5))/6.0;
}
db asr(db l,db r,db Eps,db ans)
{
	db mid=(l+r)*0.5, lans=Simpson(l,mid), rans=Simpson(mid,r);
	if(fabs(lans+rans-ans)<Eps) return lans+rans;
	return asr(l,mid,Eps*0.5,lans)+asr(mid,r,Eps*0.5,rans);
}

int main()
{
	int T,l,r; scanf("%d",&T);
	while(T--) scanf("%lf%lf%d%d",&a,&b,&l,&r), printf("%.3lf\n",asr(l,r,1e-4,Simpson(l,r)));

	return 0;
}
posted @ 2018-06-11 10:44  SovietPower  阅读(194)  评论(2编辑  收藏  举报