求助一道站外题
  • 板块题目总版
  • 楼主Autofreeze
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/2/25 16:15
  • 上次更新2023/11/5 02:43:15
查看原帖
求助一道站外题
341373
Autofreeze楼主2021/2/25 16:15

https://vjudge.net/problem/HDU-4773

正解好像是圆反演但是我喜欢暴力解方程

下面是我的屑代码,求大神看看为什么WA

#include<bits/stdc++.h>
#define N 201001
#define MAX 2001
#define re register
#define inf 1e15
#define eps 1e-12
using namespace std;
typedef long long ll;
typedef double db;
const db PI=acos(-1);
inline void read(re ll &ret)
{
	ret=0;re char c=getchar();re bool pd=false;
	while(!isdigit(c)){pd|=c=='-';c=getchar();}
	while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c&15);c=getchar();}
	ret=pd?-ret:ret;
	return;
}
ll t,cnt;
db x1,yy,x2,y2,r1,r2,x3,y3,a1,a2,b1,b2,t1,t2,ans1r,ans2r,ans1x,ans2x,ans1y,ans2y,c1,c2;
inline db dis(re db x,re db y,re db xx,re db yy)
{
	return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
signed main()
{
	read(t);
	while(t--)
	{
		cnt=0;
		scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&yy,&r1,&x2,&y2,&r2,&x3,&y3);
		if(x1<x2)
			swap(x1,x2),swap(yy,y2),swap(r1,r2);
		if(fabs(atan2(yy-y3,x1-x3)-atan2(y2-y3,x2-x3))<eps)
		{
			puts("0");
			continue;
		}
		a1=2*x1-2*x3,a2=2*x2-2*x3,b1=2*yy-2*y3,b2=2*y2-2*y3,t1=r1*r1+x1*x1+yy*yy-x3*x3-y3*y3,t2=r2*r2+x2*x2+y2*y2-x3*x3-y3*y3;
		if(fabs(a1*b2-a2*b1)<eps)
		{
			c1=dis(x3,y3,x1,yy)/2;
			a1=r1/2;
			c2=dis(x3,y3,x2,y2)/2;
			a2=r2/2;
			if(c1<a1||c2<a2)
			{
				puts("0");
				continue; 
			}
			b1=sqrt(c1*c1-a1*a1);
			b2=sqrt(c2*c2-a2*a2);
			re db tmp1x=(x3+x1)/2,tmp1y=(y3+yy)/2,tmp2x=(x3+x2)/2,tmp2y=(y3+y2)/2;
			re db d1=dis(x3,y3,tmp1x,tmp1y),d2=dis(x3,y3,tmp2x,tmp2y);
			re db tmp0=d2*d2*b2*b2/(a2*a2)-b2*b2-d1*d1*b1*b1/(a1*a1)+b1*b1;
			re db tmp1=2*d2*b2*b2/(a2*a2)+2*d1*b1*b1/(a1*a1);
			re db tmp2=b2*b2/(a2*a2)-b1*b1/(a1*a1);
			re db delt=(tmp1*tmp1-4*tmp2*tmp0);
			if(fabs(tmp2)<eps)
				ans1x=-tmp0/tmp1,cnt=1;
			else if(fabs(delt)<eps)
			{
				ans1x=(-tmp1)/(2*tmp2);
				cnt=1;
			}
			else if(delt<0)
			{
				puts("0");
				continue;
			}
			else
			{
				ans1x=(-tmp1+sqrt(delt))/(2*tmp2);
				ans2x=(-tmp1-sqrt(delt))/(2*tmp2);
				cnt=2;
			}
			ans1y=sqrt(b2*b2*(ans1x+d2)*(ans1x+d2)/a2/a2-b2*b2);
			ans1r=dis(0,0,ans1x,ans1y);
			if(fabs(ans1y)>eps)
				cnt=2,ans2y=-ans1y,ans2r=dis(0,0,ans2x,ans2y);
			printf("%lld\n",cnt);
			if(fabs(x3-x2)<eps)
			{
				printf("%.6lf %.6lf %.6lf\n",x3-ans1y,y3+ans1x,ans1r);
				if(cnt==2)
					printf("%.6lf %.6lf %.6lf\n",x3-ans2y,y3+ans2x,ans2r);
			}
			else
			{
				re db k=(y2-y3)/(x2-x3);
				printf("%.6lf %.6lf %.6lf\n",x3+ans1x/sqrt(k*k+1),y3+ans1y/sqrt(k*k+1),ans1r);
				printf("%.6lf %.6lf %.6lf\n",x3+ans2x/sqrt(k*k+1),y3+ans2y/sqrt(k*k+1),ans2r);
			}
			continue;
		}
		re db tmp2=(4*b2*b2*r1*r1-8*b1*b2*r1*r2+4*b1*b1*r2*r2+4*a2*a2*r1*r1-8*a1*a2*r1*r2+4*a1*a1*r2*r2)/(a1*a1*b2*b2-2*a1*a2*b1*b2+a2*a2*b1*b1);
		re db tmp1=(4*t1*b1*b2*r2-4*t1*b2*b2*r1+4*t2*b1*r2*r1-4*t2*b1*b1*r2+4*t1*a1*a2*r2-4*t1*a2*a2*r1+4*t2*a1*a2*r1-4*t2*a1*a1*r2)/(a1*a1*b2*b2-2*a1*a2*b1*b2+a2*a2*b1*b1);
		re db tmp0=(t1*t1*b2*b2+t2*t2*b1*b1-2*t1*t2*b1*b2+t1*t1*a2*a2+t2*t2*a1*a1-2*t1*t2*a1*a2)/(a1*a1*b2*b2-2*a1*a2*b1*b2+a2*a2*b1*b1);
		re db temp1=-(2*b2*r1-2*b1*r2)/(a1*b2-a2*b1)*2*x3-(2*a1*r2-2*a2*r1)/(a1*b2-a2*b1)*2*y3;
		re db temp0=(t1*b2-t2*b1)/(a1*b2*a2*b1)*2*x3+(a1*t2-a2*t1)/(a1*b2-a2*b1)*2*y3-x3*x3-y3*y3;
		tmp1-=temp1,tmp0-=temp0;
		re db delt=(tmp1*tmp1-4*tmp2*tmp0);
		if(fabs(delt)<eps)
		{
			ans1r=(-tmp1)/(2*tmp2);
			cnt=1;
			if(ans1r<eps)
			{
				puts("0");
				continue;
			}
		}
		else if(delt<0)
		{
			puts("0");
			continue;
		}
		else
		{
			ans1r=(-tmp1+sqrt(delt))/(2*tmp2);
			ans2r=(-tmp1-sqrt(delt))/(2*tmp2);
			if(ans1r<eps&&ans2r<eps)
			{
				puts("0");
				continue;
			}
			else if(ans1r>eps&&ans2r<eps)
				cnt=1,ans2r=0;
			else if(ans1r<eps&&ans2r>eps)
				cnt=1,ans1r=ans2r,ans2r=0;
			else
				cnt=2;
		}
		ans1x=(t1*b2-t2*b1-(2*b2*r1-2*b1*r2)*ans1r)/(a1*b2-a2*b1);
		ans1y=(a1*t2-a2*t1-(2*a1*r2-2*a2*r1)*ans1r)/(a1*b2-a2*b1);
		if(cnt==1)
		{
			puts("1");
			printf("%.6lf %.6lf %.6lf\n",ans1x,ans1y,ans1r);
		}
		else
		{
			puts("2");
			ans2x=(t1*b2-t2*b1-(2*b2*r1-2*b1*r2)*ans2r)/(a1*b2-a2*b1);
			ans2y=(a1*t2-a2*t1-(2*a1*r2-2*a2*r1)*ans2r)/(a1*b2-a2*b1);
			printf("%.6lf %.6lf %.6lf\n",ans1x,ans1y,ans1r);
			printf("%.6lf %.6lf %.6lf\n",ans2x,ans2y,ans2r);
		}
	}
	exit(0);
}
2021/2/25 16:15
加载中...