码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2338 数矩形

时间:2016-01-16 19:17:46      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

给出N(N≤1500)个点,求选四个点作为顶点组成矩形的最大面积,保证有解。

对每两个点连边,按边长排序,枚举等长且中点相同的边作为对角线组成矩形,计算面积取最大值。

时间复杂度O(n2logn)

#include<cstdio>
#include<algorithm>
int xs[1600],ys[1600];
long long ans=0;
struct edge{
    int x1,y1,x2,y2;
    long long len;
    int xm,ym;
    void cal(){
        xm=x1+x2,ym=y1+y2;
        int x=x1-x2,y=y1-y2;
        len=x*1ll*x+y*1ll*y;
    }
}es[2250005];
inline bool operator<(edge a,edge b){
    if(a.len<b.len)return 1;
    else if(a.len==b.len){
        if(a.xm<b.xm)return 1;
        else if(a.xm==b.xm)return a.ym<b.ym;
        else return 0;
    }
    else return 0;
}
inline long long cal(edge&a,edge&b){
    long long x=(a.x1-b.x1)*1ll*(a.y1-b.y2)-(a.x1-b.x2)*1ll*(a.y1-b.y1);
    return x<0?-x:x;
}
int p=0,n;
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d%d",xs+i,ys+i);
    for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){
        edge&e=es[p++];
        e.x1=xs[i],e.y1=ys[i];
        e.x2=xs[j],e.y2=ys[j];
        e.cal();
    }
    std::sort(es,es+p);
    for(int i=0;i<p;i++){
        for(int j=i+1;j<p&&es[i].len==es[j].len&&es[i].xm==es[j].xm&&es[i].ym==es[j].ym;j++){
            long long s=cal(es[i],es[j]);
            if(s>ans)ans=s;
        }
    }
    printf("%lld",ans);
    return 0;
}

 

bzoj2338 数矩形

标签:

原文地址:http://www.cnblogs.com/ccz181078/p/5136009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!