博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2338 HNOI2011 数矩形 计算几何
阅读量:5051 次
发布时间:2019-06-12

本文共 1277 字,大约阅读时间需要 4 分钟。

题目大意:给定n个点,求一个最大的矩形,该矩形的四个顶点在给定的点上

找矩形的方法是记录全部线段 若两条线段长度相等且中点重合 这两条线段就能够成为矩形的对角线

于是我们找到全部n*(n-1)/2条线段。按长度排序,长度相等依照中点排序,然后对于每一个点向前找符合要求的,计算面积。更新ans

注意避免一切double!

长度切记不能开根号。直接用long long存储,否则第三个点有两条长度极其接近的线段把double卡掉,计算面积要用叉积,中点不要除以2,连math库都不用开了!

#include
#include
#include
#include
#define M 1600using namespace std;typedef long long ll;struct point{ ll x,y; point(){} point(ll _,ll __):x(_),y(__){} bool operator == (const point &Y) const { return x==Y.x && y==Y.y ; } point operator - (const point &Y) const { return point(x-Y.x,y-Y.y); } ll operator * (const point &Y) const { return x*Y.y-Y.x*y; }}points[M];struct line{ ll len; point *p1,*p2; point midpoint; bool operator < (const line &y) const { if( len == y.len ) { if( midpoint.x == y.midpoint.x ) return midpoint.y < y.midpoint.y; return midpoint.x < y.midpoint.x; } return len < y.len; }}lines[M*M>>1];inline ll Distance(const point &p1,const point &p2){ return (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ;}ll lllabs(ll x){ return x<0?-x:x;}int n,tot;ll ans;int main(){ int i,j; cin>>n; for(i=1;i<=n;i++) { scanf("%lld%lld",&points[i].x,&points[i].y); for(j=1;j

转载于:https://www.cnblogs.com/blfbuaa/p/6866982.html

你可能感兴趣的文章
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>
php修改SESSION的有效生存时间
查看>>
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>