BZOJ 1356: [Baltic2009]Rectangle

没什么神奇的几何题

只要知道 一个矩阵四点共圆 + 两条对角线中点坐标相同 就好了

n2枚举所有可能被构成的对角线

然后从对角线里面挑就好了,但是再n2枚举对角线会爆(别像我一样做题忘记看数据范围)

尝试在同一个圆上来枚举(排序后可以做到),应该。不会炸吧。反正我a掉了(被卡精度了好气哦)

#include <cmath>
#include <cstdio>
#include <algorithm>
#define RG register
#define LL long long
#define N 1510
using namespace std;
 
int read()
{
    int a=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}
    return a*f;
}
 
int n;
LL ans;
 
struct edge
{
    int x,y,len;
    int p1,p2;
}a[(N*N)>>1];
 
int x[N],y[N];
 
bool cmp(edge a,edge b)
{
    if(a.x==b.x)
    {
        if(a.y==b.y)
        {
            return a.len<b.len;
        }else return a.y<b.y;
    }else return a.x<b.x;
}
 
double calc(int a,int b)
{
    return 1.0*sqrt(1ll*((1ll*a*a)+(1ll*b*b)));
}
 
int cnt;
int main()
{
    n=read();
    for(RG int i=1;i<=n;i++)
        x[i]=read(),y[i]=read();
    for(RG int i=1;i<=n;i++)
    {
        for(RG int j=i+1;j<=n;j++)
        {
            a[++cnt].len=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
            a[cnt].x=x[i]+x[j],a[cnt].y=y[i]+y[j];
            a[cnt].p1=i,a[cnt].p2=j;
        }
    }
    sort(a+1,a+cnt+1,cmp);
    for(RG int i=1,j;i<=cnt;i=j+1)
    {
        j=i;
        while(a[i].len==a[j+1].len&&a[i].x==a[j+1].x&&a[i].y==a[j+1].y) ++j;
        if(i==j) continue;
        for(RG int k=i;k<=j;++k)
            for(RG int l=k+1;l<=j;++l)
            {
                double t1=calc(x[a[k].p1]-x[a[l].p1],y[a[k].p1]-y[a[l].p1]);
                double t2=calc(x[a[k].p1]-x[a[l].p2],y[a[k].p1]-y[a[l].p2]);
                LL S=1ll*(t1*t2+0.5);
                ans=max(ans,S);
            }
    }
    printf("%lld\n",ans);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值