BZOJ2338: [HNOI2011]数矩形

时间:2023-03-08 16:55:05

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338

中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标及长度,然后排一遍序扫一遍更新答案。。(听说开double会炸?

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 1505
#define inf int(1e9)
#define eps 1e-6
using namespace std;
typedef long long ll;
struct data{ll len,x,y;int a,b;
}a[maxn*maxn];
struct node{ll x,y;
};
int n,cnt,next,now;
ll ans,x[maxn],y[maxn];
ll read(){
ll x=,f=; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
ll sqr(ll x){
return x*x;
}
ll dis(int a,int b){
return sqr(x[a]-x[b])+sqr(y[a]-y[b]);
}
bool cmp(data a,data b){
if (a.x==b.x&&a.len==b.len) return a.y<b.y;
else if (a.len==b.len) return a.x<b.x;
return a.len<b.len;
}
bool jud(data a,data b){
if (a.x==b.x&&a.y==b.y&&a.len==b.len) return ;
return ;
}
ll cross(node p,node q){
return abs(p.x*q.y-p.y*q.x);
}
void solve(data a,data b){
node p=(node){x[a.a]-x[a.b],y[a.a]-y[a.b]};
node q=(node){x[a.a]-x[b.a],y[a.a]-y[b.a]};
ans=max(ans,cross(p,q));
}
int main(){
scanf("%d",&n);
rep(i,,n){
x[i]=read(); y[i]=read();
}
rep(i,,n) rep(j,i+,n) a[++cnt]=(data){dis(i,j),x[i]+x[j],y[i]+y[j],i,j};
sort(a+,a++cnt,cmp);
now=cnt;
while (now>){
next=now-;
while (jud(a[now],a[next])) {
solve(a[now],a[next]);
next--;
}
now--;
}
printf("%lld\n",ans);
return ;
}