对于两条线段,若其中点重合,且长度相等,那么它们一定是某个矩形的对角线。

N*N地处理出所有线段,排序,对每一部分中点重合、长度相等的线段进行暴力枚举,更新答案。

用 long double 注意EPS的设置,卡精度。

注意数组大小的设置,容易MLE。

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
#define EPS 0.000000000000001
#define N 1501
typedef long long ll;
typedef long double llf;
llf sqr(const llf &x){return x*x;}
struct Point
{
llf x,y;
Point(const llf &a,const llf &b){x=a;y=b;}
Point(){}
void Read(){cin>>x>>y;}
};
typedef Point Vector;
struct Line
{
Point l,r,m; llf len;
Line(const Point &a,const Point &b){l=a;r=b;}
Line(){}
void Init(){m=Point((l.x+r.x)/2.0,(l.y+r.y)/2.0);len=sqrt(sqr(l.x-r.x)+sqr(l.y-r.y));}
};
bool Equal(const llf &a,const llf &b){return fabs(a-b)<EPS ? : ;}
bool Less(const llf &a,const llf &b){return a-b<(-EPS) ? : ;}
bool LeEqu(const llf &a,const llf &b){return a-b<EPS ? : ;}
bool operator < (const Point &a,const Point &b)
{return (!Equal(a.x,b.x))?Less(a.x,b.x):Less(a.y,b.y);}
bool operator == (const Point &a,const Point &b)
{return (Equal(a.x,b.x)&&Equal(a.y,b.y)) ? : ;}
bool operator != (const Point &a,const Point &b){return a==b ? : ;}
bool operator < (const Line &a,const Line &b)
{return a.m!=b.m ? a.m<b.m : Less(a.len,b.len);}
bool operator == (const Line &a,const Line &b)
{return (Equal(a.len,b.len)&&a.m==b.m) ? : ;}
bool operator != (const Line &a,const Line &b){return a==b ? : ;}
Vector operator - (const Point &a,const Point &b){return Vector(a.x-b.x,a.y-b.y);}
llf Cross(const Vector &a,const Vector &b){return a.x*b.y-a.y*b.x;}
int n,m,head;
Point p[N];
llf ans;
Line lines[N*N>>];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) p[i].Read();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(p[i]!=p[j])
{
lines[++m]=Line(p[i],p[j]);
lines[m].Init();
}
sort(lines+,lines+m+);
for(int i=;i<=m;i++)
{
if(lines[i]!=lines[i-]) head=i;
if(lines[i]!=lines[i+])
if(i-head)
{
for(int j=head;j<=i;j++)
for(int k=j+;k<=i;k++)
ans=max(ans,fabs(Cross(lines[j].l-lines[j].m,lines[k].l-lines[k].m))
+fabs(Cross(lines[j].l-lines[j].m,lines[k].r-lines[k].m)));
}
}
printf("%lld\n",(ll)ans);
return ;
}

【计算几何】bzoj2338 [HNOI2011]数矩形的更多相关文章

  1. bzoj2338[HNOI2011]数矩形 计算几何

    2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1535  Solved: 693[Submit][Status ...

  2. BZOJ2338: [HNOI2011]数矩形

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...

  3. {bzoj2338 [HNOI2011]数矩形 && NBUT 1453 LeBlanc}平面内找最大矩形

    思路: 枚举3个点,计算第4个点并判断是否存在,复杂度为O(N3logN)或O(N3α) 考虑矩形的对角线,两条对角线可以构成一个矩形,它们的长度和中点必须完全一样,于是将所有线段按长度和中点排序,那 ...

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

    题目链接: 2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MB Description Input   Output 题意: 思路 ...

  5. 【BZOJ2338】[HNOI2011]数矩形 几何

    [BZOJ2338][HNOI2011]数矩形 题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两 ...

  6. 【题解】Luogu P3217 [HNOI2011]数矩形

    原题链接:P3217 [HNOI2011]数矩形 什么??!怎么又是计算几何,您钛毒瘤了-- 这道题真的是毒瘤 凸包?旋转卡壳? 看一下数据,N<=1500? 暴力 没错,就是暴力,N^2没毛病 ...

  7. luogu P3217 [HNOI2011]数矩形

    LINK:数矩形 题意:给出n个点 求出一个最大的矩形. 矩形可以使斜着的.(不会告诉你样例我算了几年 这道题的一个潜规则 矩形面积都是整数 我也不知道为啥一定是整数 姑且是题目输出的要求吧. 所以用 ...

  8. 【bzoj2338】[HNOI2011]数矩形 计算几何

    题目描述 题解 计算几何 由于对角线平分且相等的四边形是矩形,因此我们可以把每条对角线存起来,按照对角线长度和中点位置为关键字排序,这样对于每个相同长度和中点的对角线就排到了一起. 于是对于每段可能形 ...

  9. BZOJ 2338 HNOI2011 数矩形 计算几何

    题目大意:给定n个点,求一个最大的矩形,该矩形的四个顶点在给定的点上 找矩形的方法是记录全部线段 若两条线段长度相等且中点重合 这两条线段就能够成为矩形的对角线 于是我们找到全部n*(n-1)/2条线 ...

随机推荐

  1. spring 中的@Import注解和@ImportResource注解

    概述:@Import注解是引入带有@Configuration的java类. @ImportResource是引入spring配置文件.xml 案例的核心代码如下: package com.timo. ...

  2. 如何取消PPT中的动画效果

    幻灯片放映——>设置放映式——>勾选放映时不加动画 (office2007)

  3. __cdecl,__stdcall,__fastcall,__pascal,__thiscall 的区别

    关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解. microsoft的vc默认的是__cdecl方式,而windo ...

  4. The 'brew link' step did not complete successfully

    在mac 上更新node时遇到了一系列的问题: 卸载node重新安装之后提示: The 'brew link' step did not complete successfully 其实这里已经给出了 ...

  5. [bzoj3532][Sdoi2014]Lis——拆点最小割+字典序+退流

    题目大意 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性 ...

  6. bzoj 1293 贪心

    首先我们可以将这道题看成一个数轴,数轴其中的某些点存在一些颜色,我们要选取最短的一段,使这段存 在所有颜色,那么我们使用指针i,j表示在j-i位置中包含的颜色,那么初值是0,0,我们先i++,同时添加 ...

  7. bzoj 1901 线段树套平衡树+二分答案查询

    我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...

  8. 自己申请了苹果的ID号,如何输入到平板上,从而换掉原先的其他账号呢?

    刚买了Ipad平板电脑,一直是用商家给我设置的ID,但是时间一长,我希望用自己的ID来玩我的平板,便于下载程序,更新程序,不用每次去问人家密码是多少. 申请IPAD ID 的网站是:http://ww ...

  9. python常用模块补充hashlib configparser logging,subprocess模块

    一.hashlib模板 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

  10. 最小生成树Prim算法Kruskal算法

    Prim算法采用与Dijkstra.Bellamn-Ford算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点. 算法分析 & 思想讲解: Prim算法每次 ...