BZOJ 1502([NOI2005]月下柠檬树-Simpson积分)
![BZOJ 1502([NOI2005]月上柠檬树-Simpson积分)](http://img.reader8.net/uploadfile/jiaocheng/20140140/2741/2014012719411620138.png)
1≤n≤500,0.3<alpha<π 2,0<hi≤100,0<ri≤100。
10%的数据中,n=1。
30%的数据中,n≤2。
60%的数据中,n≤20。
100%的数据中,n≤500。
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<functional>using namespace std;#define MAXN (500+10)#define eps 1e-8double h[MAXN],s[MAXN],r[MAXN],alpha,l1=0,r1=0;double sqr(double x){return x*x;}int n,size=0;struct S{double x,y,p,q;}c[MAXN];double f(double l){double t=0.0;for (int i=0;i<n;i++){if (fabs(s[i]-l)<r[i]) t=max(t,sqrt(sqr(r[i])-sqr(s[i]-l)));}for (int i=1;i<=size;i++){if (c[i].x<l&&l<c[i].p)t=max(t,c[i].y+(c[i].q-c[i].y)*(l-c[i].x)/(c[i].p-c[i].x));}return t;}double simpson(double l,double r,double fl,double fmid,double fr){return (fl+4*fmid+fr)*(r-l)/6;}double rsimpson(double l,double r,double fl,double fmid,double fr){double m=(l+r)/2;double p=f((l+m)/2),q=f((m+r)/2);double x=simpson(l,r,fl,fmid,fr),y=simpson(l,m,fl,p,fmid),z=simpson(m,r,fmid,q,fr);if (fabs(x-y-z)<eps)return y+z;return rsimpson(l,m,fl,p,fmid)+rsimpson(m,r,fmid,q,fr);}int main(){scanf("%d%lf",&n,&alpha);alpha=1/tan(alpha);for (int i=0;i<=n;i++){scanf("%lf",&h[i]);if (i) h[i]+=h[i-1];s[i]=h[i]*alpha;}for (int i=0;i<n;i++){scanf("%lf",&r[i]);l1=min(l1,s[i]-r[i]);r1=max(r1,s[i]+r[i]);}r[n]=0;for (int i=0;i<n;i++){double d=s[i+1]-s[i];if (d>fabs(r[i]-r[i+1])){c[++size].x=s[i]-r[i]*(r[i+1]-r[i])/d;c[size].y=sqrt(sqr(r[i])-sqr(c[size].x-s[i]));c[size].p=s[i+1]-r[i+1]*(r[i+1]-r[i])/d;c[size].q=sqrt(sqr(r[i+1])-sqr(c[size].p-s[i+1]));}}r1=max(r1,s[n]);printf("%.2lf",2*rsimpson(l1,r1,0,f((l1+r1)/2),0));return 0;}