• bzoj2338数矩形(rectangle)


    数矩形(rectangle)


    计算几何

    把所有点两两连线,把这些线按长度排序,再按中点排序

    能组成矩形的线一定是连续的

    最坏就是所有点围成一个圆,交于圆心

    复杂度O(可以过)

    要用叉积,不然会被卡精

    我居然认为极角序就是逆时针,错了好久

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 1505
    #define eps 1e-11
    using namespace std;
    int n,tot;
    struct po{
        long long x,y,len,mx,my;
    }s[maxn],a[maxn*maxn],t1,t2;
    long long ans;
    long long getl(int i,int j){
        return (s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y);
    }
    bool cmp(po a,po b){
        if(a.len==b.len)return a.mx<b.mx||a.mx==b.mx&&a.my<b.my;
        return a.len<b.len;
    }
    long long cj(po a,po b){
        return a.x*b.y-a.y*b.x;
    }
    bool pd(int i,int j)
    {
        if(getl(a[i].x,a[j].x)!=getl(a[i].y,a[j].y))return 0;
        if(getl(a[i].x,a[j].y)!=getl(a[i].y,a[j].x))return 0;
        return 1;
    }
    long long size(int i,int j){
        po h[4];
        h[0]=s[a[i].x],h[1]=s[a[j].y];
        h[2]=s[a[i].y],h[3]=s[a[j].x]; 
        long long sum=0;
        for(int i=0;i<4;i++){
            sum+=cj(h[i],h[(i+1)%4]); 
        }
        return abs(sum);
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++)scanf("%lld%lld",&s[i].x,&s[i].y);
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                a[++tot].x=i,a[tot].y=j;
                a[tot].mx=s[i].x+s[j].x,a[tot].my=s[i].y+s[j].y;
                a[tot].len=getl(i,j);
            }
        }
        sort(a+1,a+tot+1,cmp);
        int l=1,now=1;
        while(l<=tot){
            while(a[l].len==a[now].len&&a[now].mx==a[l].mx&&a[now].my==a[l].my&&now<=tot)now++;
            now--;
            for(int i=l;i<=now;i++){
                for(int j=i+1;j<=now;j++){
                    if(pd(i,j)){
                        ans=max(ans,size(i,j));
                    }
                }
            }
            now++;l=now;
        }
        cout<<(long long)ans/2<<endl;
        return 0;
    }
  • 相关阅读:
    [Win32]一个调试器的实现(十)显示变量
    [Win32]防止套接字被继承
    [C++]实现委托模型
    [Win32]一个调试器的实现(十一)显示函数调用栈
    [Win32]IP数据报的首部如何定义
    FMECA方法及工程应用
    C#控制台应用程序自动关闭
    ckedit 3.0 配置(一)
    [转]“余则成”教你办公室生存法则20条
    Element UI之Select选择器优化
  • 原文地址:https://www.cnblogs.com/liankewei/p/10358842.html
Copyright © 2020-2023  润新知