bzoj 2338: [HNOI2011]数矩形 (计算几何)

来源:互联网 发布:百科门窗软件下载 编辑:程序博客网 时间:2024/06/07 02:46

题目描述

传送门

题目大意:给出n个点,求顶点都在n个点中的最大矩形。

题解

代码

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#define N 1503#define LL long long using namespace std;int n,cnt,top,st[N*N];struct data{    LL x,y;    data(LL X=0,LL Y=0) {        x=X,y=Y;    }}p[N]; data operator -(data a,data b){    return data(a.x-b.x,a.y-b.y);}LL pow(LL x){    return x*x;}struct line{    LL x,y; LL len;    double ang; int a,b;    line(int A=0,int B=0) {        a=A,b=B; x=p[a].x+p[b].x; y=p[a].y+p[b].y;        len=pow(p[a].x-p[b].x)+pow(p[a].y-p[b].y);        ang=atan2(p[b].y-p[a].y,p[b].x-p[a].x);    }}l[N*N];int cmp(line a,line b){    return a.x<b.x||a.x==b.x&&a.y<b.y||a.x==b.x&&a.y==b.y&&a.len<b.len||           a.x==b.x&&a.y==b.y&&a.len==b.len&&a.ang<b.ang;   }bool check(line a,line b){   return a.x==b.x&&a.y==b.y&&a.len==b.len;}LL cross(data a,data b){    return a.x*b.y-a.y*b.x;}LL squ(line i,line j){    data v=p[i.a]-p[j.a];    data u=p[i.b]-p[j.a];    return abs(cross(v,u));}int main(){    freopen("a.in","r",stdin);    scanf("%d",&n);    for (int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y);    cnt=0;    for (int i=1;i<=n;i++)     for (int j=i+1;j<=n;j++)      l[++cnt]=line(i,j);    sort(l+1,l+cnt+1,cmp);    LL ans=0;    for (int i=1,j;i<=cnt;i=j+1) {        j=i;        top=0;        while (j<=cnt&&check(l[i],l[j])) {            st[++top]=j;            j++;        }        j--;        int tail=1;        for (int k=1;k<=top;k++) {            int c=tail;            while (squ(l[st[tail]],l[st[k]])<squ(l[st[tail%top+1]],l[st[k]])){                tail=tail%top+1;                if (tail==c) break;            }            ans=max(ans,squ(l[st[tail]],l[st[k]]));        }    }    printf("%lld\n",ans);}
0 0