求助!
查看原帖
求助!
369181
bamboo12345楼主2023/7/29 09:08

rt,不知道为什么会有小数出来,只有20pts,强转成 long long 又有70pts

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1505;
const long double eps=1e-8;
int n,x[maxn],y[maxn],tot;
struct Edge
{
	int sx,sy,ex,ey;
} e[maxn*maxn],a[maxn*maxn],b[maxn*maxn];
int cnt,ind;
int cross(int sx,int sy,int ex,int ey)
{
	return sx*ey-sy*ex;
}
bool cmp1(Edge x,Edge y)
{
	return cross(x.ex-x.sx,x.ey-x.sy,y.ex-y.sx,y.ey-y.sy)>0;
}
bool cmp2(Edge x,Edge y)
{
	if(x.sx!=x.ex)
	{
		long double k=(x.ey-x.sy)/(double)(x.ex-x.sx);
		if(!k)
			return x.sx<y.sx;
		k=-1.0/k;
		long double b1=(long double)(x.sy)-k*x.sx;
		long double b2=(long double)(y.sy)-k*y.sx;
		return (eps<b2-b1);
	}
	else
		return x.sy<y.sy;
}
int dis(int sx,int sy,int ex,int ey)		
{
	return (ex-sx)*(ex-sx)+(ey-sy)*(ey-sy);
}
bool cmp3(Edge x,Edge y)
{
	return dis(x.sx,x.sy,x.ex,x.ey)<dis(y.sx,y.sy,y.ex,y.ey);
}
double ans;
void work()
{
	sort(b+1,b+ind+1,cmp2);
	int last=1;
	for(int i=1;i<=ind;i++)
	{
		if(cmp2(b[i],b[i+1])||cmp2(b[i+1],b[i])||i==ind)
		{
			int len1=dis(b[i].sx,b[i].sy,b[i].ex,b[i].ey);
			int len2=dis(b[i].sx,b[i].sy,b[last].sx,b[last].sy);
			ans=max(ans,(sqrt(len1)*sqrt(len2)));
			last=i+1;
		}
	}
//	cout <<endl;
}
void solve()
{
	sort(a+1,a+cnt+1,cmp3);
	int last=1;
	for(int i=1;i<=cnt;i++)
	{
		if(dis(a[i].sx,a[i].sy,a[i].ex,a[i].ey)!=dis(a[i+1].sx,a[i+1].sy,a[i+1].ex,a[i+1].ey)||i==cnt)
		{
			ind=0;
			for(int j=last;j<=i;j++)
				b[++ind]=a[j];
			work();
			last=i+1;
		}
	}
}
signed main()
{
	cin >>n;
	for(int i=1;i<=n;i++)
		cin >>x[i]>>y[i];
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
		{
			tot++;
			e[tot].sx=x[i],e[tot].sy=y[i],e[tot].ex=x[j],e[tot].ey=y[j];
			if(x[i]>x[j])
				swap(e[tot].sx,e[tot].ex),swap(e[tot].sy,e[tot].ey);
			else if(x[i]==x[j]&&y[i]>y[j])
				swap(e[tot].sy,e[tot].ey);
		}
	sort(e+1,e+tot+1,cmp1);
	int last=1;
	for(int i=1;i<=tot;i++)
	{
		if(cross(e[i].ex-e[i].sx,e[i].ey-e[i].sy,e[i+1].ex-e[i+1].sx,e[i+1].ey-e[i+1].sy)!=0||i==tot)
		{
			cnt=0;
			for(int j=last;j<=i;j++)
				a[++cnt]=e[j];
			solve();
			last=i+1;
		}
	//	cout <<i<<" "<<e[i].sx<<" "<<e[i].sy<<" "<<e[i].ex<<" "<<e[i].ey<<endl;
	}
	cout <<(long long)ans<<endl;
	return 0;
}
/*
4
-100000000 -100000000
-100000000 100000000
100000000 -100000000
100000000 100000000
*/
2023/7/29 09:08
加载中...