HDU 1724 Ellipse ——Simpson积分
【题目分析】
一看题目,直接把椭圆积分起来就可以了嘛。
然后发现椭圆比较难积分,还是算了吧。
用Simpson积分硬上。
大概就是用二次函数去拟合面积。
【代码】
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; #define maxn 500005 #define eps 1e-8 #define db double #define ll long long #define inf 0x3f3f3f3f #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i>=k;--i) void Finout() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); #endif } int Getint() { int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();} while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } db a,b,l,r; int T; db cal(db l,db r) { db fl=2*sqrt((a*a*b*b-b*b*l*l)/(a*a)),fr=2*sqrt((a*a*b*b-b*b*r*r)/(a*a)),mid=(l+r)/2; db fm=2*sqrt((a*a*b*b-b*b*mid*mid)/(a*a)); return ((r-l)/6)*(fl+fr+4*fm); } db simpson(db l,db r) { db mid=(l+r)/2,s1=cal(l,r),s2=cal(l,mid)+cal(mid,r); if (s2-s1<=eps) return s2; else return simpson(l,mid)+simpson(mid,r); } int main() { Finout(); T=Getint(); while (T--) { scanf("%lf%lf%lf%lf",&a,&b,&l,&r); printf("%.3f\n",simpson(l,r)); } }