P4207求调
  • 板块学术版
  • 楼主Brokwind
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/26 15:04
  • 上次更新2024/11/26 18:31:40
查看原帖
P4207求调
1153557
Brokwind楼主2024/11/26 15:04

P4207 WA on #9

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;

const int MAXN=5e2+10;
const double eps=1e-5;

struct Seg{
	double lx,ly,rx,ry;
}s[MAXN];

double f(Seg i,double x){
	double lx=i.lx,rx=i.rx,ly=i.ly,ry=i.ry;
	if(x<lx||x>rx){
		return 0;
	}
	return (x*(ry-ly)+ly*rx-lx*ry)/(rx-lx);
}

struct C{
	double O,r=0;
}c[MAXN];

double f(C i,double x){
	double O=i.O,r=i.r;
	if(x<O-r||x>O+r){
		return 0;
	}
	return sqrt(r*r-(O-x)*(O-x));
}

int num1,num2;

double f(double x){
	double re=0;
	for(int i=1;i<=num1;i++){
		re=max(re,f(s[i],x));
	}
	for(int i=1;i<=num2;i++){
		re=max(re,f(c[i],x));
	}
	return re;
}

double simpson(double l,double r,double fl,double fr){
	double mid=l+(r-l)/2;
	double fm=f(mid);
	return (fl+4*fm+fr)*(r-l)/6;
}

double asr(double l,double r,double ans,double eps,double fl,double fr){
	double mid=l+(r-l)/2;
	double fm=f(mid);
	double l_ans=simpson(l,mid,fl,fm);
	double r_ans=simpson(mid,r,fm,fr);
	if(fabs(ans-l_ans-r_ans)<15*eps){
		return l_ans+r_ans+(l_ans+r_ans-ans)/15;
	}else{
		l_ans=asr(l,mid,l_ans,eps/2,fl,fm);
		r_ans=asr(mid,r,r_ans,eps/2,fm,fr);
		return l_ans+r_ans;
	}
}

double asr(double l,double r,double eps){
	double fl=f(l);
	double fr=f(r);
	return asr(l,r,simpson(l,r,fl,fr),eps,fl,fr);
}

int n;
double d[MAXN],r[MAXN],alp;

int main(){
	cin>>n>>alp;
	alp=1.0/tan(alp);
	for(int i=1;i<=n+1;i++){
		cin>>d[i];
		d[i]+=d[i-1];
	}
	for(int i=1;i<=n;i++){
		cin>>r[i];
		num2++;
		c[num2].r=r[i];
		c[num2].O=d[i]*alp;
	}
	num2++;
	c[num2].O=d[n+1]*alp;
	for(int i=1;i<=n;i++){
		num1++;
		if(fabs(c[i].r-c[i+1].r)<eps){
			s[i].lx=c[i].O,s[i].rx=c[i+1].O;
			s[i].ly=s[i].ry=c[i].r;
			continue;
		}
		double co=-(c[i].r-c[i+1].r)/(c[i].O-c[i+1].O);
		if(fabs(co)>1){
			continue;
		}
		double si=sqrt(1-co*co);
		s[i].lx=c[i].O+c[i].r*co,s[i].ly=si*c[i].r;
		s[i].rx=c[i+1].O+c[i+1].r*co,s[i].ry=si*c[i+1].r;
	}
//	for(int i=1;i<=num1;i++){
//		cout<<c[i].O<<' '<<c[i].r<<' '<<c[i+1].O<<' '<<c[i+1].r<<' '<<s[i].lx<<' '<<s[i].ly<<' '<<s[i].rx<<' '<<s[i].ry<<endl;
//		if(fabs(c[i].O-c[i+1].O)<fabs(c[i].r-c[i+1].r)){
//			cout<<1<<endl;
//		}else{
//			cout<<0<<endl;
//		}
//	}
	cout<<fixed<<setprecision(2)<<asr(c[1].O-c[1].r,max(c[num2].O,c[num2-1].O+c[num2-1].r),eps)*2.0;
	
	return 0;
}
2024/11/26 15:04
加载中...