bzoj2338[HNOI2011]数矩形 计算几何
2338: [HNOI2011]数矩形
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1535 Solved: 693
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
我开始想着记每条线的斜率,然后排序来找平行线,但却不能保证构成矩形。
一种新奇的思路:记录对角线,两条对角线长度相等且中点相同时可以确定一个矩形
然后题目就变得简单起来。枚举每两点,存放它们构成的线段,排序。
每条线段向前扩展找可以形成对角线的线段,找到之后更新答案。
为了避免精度错误,一切都可以用整形来计算,即算距离时不开根,中点不除2
#include<bits/stdc++.h>
#define N 1505
#define ll long long
using namespace std;
int n,cnt;ll ans;
struct P{
int x,y;
bool operator < (const P &b)const{return x==b.x?y<b.y:x<b.x;}
P operator - (const P &b)const{return (P){x-b.x,y-b.y};}
bool operator == (const P &b)const{return x==b.x&&y==b.y;}
}p[N];
struct line{
ll len;P a,b,mid;
bool operator < (const line &b)const{return len==b.len?mid<b.mid:len<b.len;}
}l[N*N/];
ll dis(P a,P b){return 1ll*(a.x-b.x)*(a.x-b.x)+1ll*(a.y-b.y)*(a.y-b.y);}
ll crs(P a,P b){return 1ll*a.x*b.y-1ll*a.y*b.x;}
void update(int i,int j){
P a=l[i].a,c=l[j].a,d=l[j].b;
P x=d-a,y=c-a;
//if(!crs(y,l[i].mid))y=d-a;
ll tmp=abs(crs(x,y));if(tmp>ans)ans=tmp;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
l[++cnt].len=dis(p[i],p[j]);
l[cnt].a=p[i];l[cnt].b=p[j];
l[cnt].mid=(P){p[i].x+p[j].x,p[i].y+p[j].y};
}
sort(l+,l++cnt);int j;
for(int i=;i<=cnt;i++){
j=i-;
while(l[j].len==l[i].len&&l[j].mid==l[i].mid)update(i,j--);
}
printf("%lld\n",ans);
return ;
}
bzoj2338[HNOI2011]数矩形 计算几何的更多相关文章
- bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
题目链接: 2338: [HNOI2011]数矩形 Time Limit: 20 Sec Memory Limit: 128 MB Description Input Output 题意: 思路 ...
- 【bzoj2338】[HNOI2011]数矩形 计算几何
题目描述 题解 计算几何 由于对角线平分且相等的四边形是矩形,因此我们可以把每条对角线存起来,按照对角线长度和中点位置为关键字排序,这样对于每个相同长度和中点的对角线就排到了一起. 于是对于每段可能形 ...
- 【计算几何】bzoj2338 [HNOI2011]数矩形
对于两条线段,若其中点重合,且长度相等,那么它们一定是某个矩形的对角线. N*N地处理出所有线段,排序,对每一部分中点重合.长度相等的线段进行暴力枚举,更新答案. 用 long double 注意EP ...
- BZOJ2338: [HNOI2011]数矩形
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...
- BZOJ 2338 HNOI2011 数矩形 计算几何
题目大意:给定n个点,求一个最大的矩形,该矩形的四个顶点在给定的点上 找矩形的方法是记录全部线段 若两条线段长度相等且中点重合 这两条线段就能够成为矩形的对角线 于是我们找到全部n*(n-1)/2条线 ...
- {bzoj2338 [HNOI2011]数矩形 && NBUT 1453 LeBlanc}平面内找最大矩形
思路: 枚举3个点,计算第4个点并判断是否存在,复杂度为O(N3logN)或O(N3α) 考虑矩形的对角线,两条对角线可以构成一个矩形,它们的长度和中点必须完全一样,于是将所有线段按长度和中点排序,那 ...
- 【BZOJ2338】[HNOI2011]数矩形 几何
[BZOJ2338][HNOI2011]数矩形 题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两 ...
- 【题解】Luogu P3217 [HNOI2011]数矩形
原题链接:P3217 [HNOI2011]数矩形 什么??!怎么又是计算几何,您钛毒瘤了-- 这道题真的是毒瘤 凸包?旋转卡壳? 看一下数据,N<=1500? 暴力 没错,就是暴力,N^2没毛病 ...
- 【BZOJ2338】【HNOI2011】数矩形 [计算几何]
数矩形 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 最近某歌手在研究自己的全国巡回演出, ...
随机推荐
- Flask-uploads 简单使用
pip install flask-uploads#先导入次此处需要用到的库: from flask_uploads import UploadSet, IMAGES, configure_uploa ...
- Spark性能优化总结
1. 避免重复加载RDD 比如一份从HDFS中加载的数据 val rdd1 = sc.textFile("hdfs://url:port/test.txt"),这个test.txt ...
- Python-字典、集合、字符编码、文件操作整理-Day3
1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...
- 理解JavaScript中的call和apply方法
call方法 总的来说call()有这几种作用:1.可以借用另一个对象的方法.2.改变this的指向(重要).3.将arguments数组化.下面详细介绍这三种作用: 1.可以借用另一个对象的方法:当 ...
- 一种dubbo逻辑路由方案(服务化隔离环境)
背景介绍 现在很多的公司都在用dubbo.springcloud做为服务化/微服务的开发框架,服务化之后应用越来越多,链路越来越长,服务环境的治理变的很困难.比如:研发团队的人很多的,同时有几个分支在 ...
- Flume(一):简介架构
Flume架构以及应用介绍 Spark Streaming:http://blog.csdn.net/jianghuxiaojin/article/details/51452593 生产者消费者模式: ...
- Tensorflow会话Session
转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...
- requests-所有异常归类
IOError RequestException HTTPError(RequestException) UnrewindableBodyError(RequestException) RetryEr ...
- Java学习图形界面+网络编程案例---------网络简易通讯
主要思想: 主类继承JPanel,在构造方法中将JFrame设成空布局:在其中适当位置添加组件:实现事件监听处理 DATE:2015-10-31 服务器端代码: /** * @author Oyc * ...
- [C#]设计模式-抽象工厂-创建型模式
介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 -- 抽象工厂. 那什么是抽象工厂呢? 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相 ...