【BZOJ2338】【HNOI2011】数矩形 [计算几何]
数矩形
Time Limit: 20 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
最近某歌手在研究自己的全国巡回演出,他将所有心仪的城市都用平面上一个点来表示,并打算从中挑选出4个城市作为这次巡回演出的地点。
为了显示自己与众不同,他要求存在一个矩形使得挑选出的4个点恰好是这个矩形的4个顶点,并且希望这个矩形的面积最大。
这可急坏了经纪人,于是他向全球歌迷征集方案,当然你这位歌迷一定不会错过这个机会。
Input
第一行是一个正整数N,表示平面上点的个数(即某歌手心仪的城市数)。
接下来N行,每行是两个整数Xi,Yi,表示对应点的坐标。
Output
Sample Input
8
-2 3
-2 -1
0 3
0 -1
1 -1
2 1
-3 1
-2 1
Sample Output
HINT
Main idea
给出平面上的若干个点,求出可由这些点作为顶点构成的矩形的最大面积。
Solution
显然是一道计算几何题。
先考虑矩形的特征:对角线长度相同并且对角线的中点在同一位置。
然后我们可以n^2枚举出所有对角线的长度并且求出其中点位置,按照长度为第一关键字,中点坐标为第二关键字sort一遍,那么显然可构成矩形的四个点的对角线一定是连续的。
然后我们枚举所有情况,用矢量叉积来求矩形的面积。
证明一下复杂度:发现最坏情况应该是所有的中点聚集在同一个点上,以其作为圆心,对角线长度作为直径拓展出成为一个圆,这样的话会有1500/2条长度相同的需要枚举的边,但是由于这是一个圆,所以两点连线不作为直径的构成的边几乎都是不需要枚举的,复杂度正确。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
using namespace std; const int ONE=; int n;
int cnt,num;
int l[ONE*ONE],r[ONE*ONE];
long long Ans; struct power
{
long long x,y;
}a[ONE]; struct point
{
long long dist;
int i,j;
power mid;
}b[ONE*ONE]; int cmp(const point &a,const point &b)
{
if(a.dist<b.dist) return ;
if(a.dist>b.dist) return ;
if(a.dist==b.dist)
{
if(a.mid.x<b.mid.x) return ;
if(a.mid.y<b.mid.y) return ;
}
return ;
} int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} long long Get_dist(power a,power b)
{
return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
} long long Get_area(power a1,power a2,power b1,power b2)
{
long long x1=a2.x-a1.x, y1=a2.y-a1.y;
long long x2=b2.x-b1.x, y2=b2.y-b1.y;
return abs( (x1*y2)-(x2*y1) );
} void Deal()
{
for(int k=;k<=num;k++)
{
if(l[k]==r[k]) continue;
for(int i=l[k];i<=r[k];i++)
for(int j=i+;j<=r[k];j++)
{
Ans=max(Ans,Get_area( a[b[i].i],a[b[i].j] , a[b[j].i],a[b[j].j]) );
}
}
} int main()
{
n=get();
for(int i=;i<=n;i++)
{
a[i].x=get(); a[i].y=get();
} for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
b[++cnt].dist=Get_dist(a[i],a[j]);
b[cnt].mid.x=(a[i].x+a[j].x);
b[cnt].mid.y=(a[i].y+a[j].y);
b[cnt].i=i; b[cnt].j=j;
} sort(b+,b+cnt+,cmp); int i=; while(i<=cnt)
{
i++;
l[++num]=i;
while(b[i].dist==b[i+].dist && b[i].mid.x==b[i+].mid.x && b[i].mid.y==b[i+].mid.y && i<=cnt)
{
i++;
}
r[num]=i;
} Deal();
printf("%lld",Ans/); }
【BZOJ2338】【HNOI2011】数矩形 [计算几何]的更多相关文章
- bzoj2338[HNOI2011]数矩形 计算几何
2338: [HNOI2011]数矩形 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1535 Solved: 693[Submit][Status ...
- 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没毛病 ...
随机推荐
- Anytime项目开发记录2
注册,登陆于密码找回.这是这次记录的主要内容. 首先,我们来看类图: 因为一直在改,所以与第二篇介绍项目框架时的图会有一些不一样. 代码都是非常简单的. 由于在注册和登陆这里,需要弹出一些对话框告诉用 ...
- 「日常训练」 Finite or not? (CFR483D2C)
题意(Codeforces 984C) 给定p,q,b" role="presentation">p,q,bp,q,b,问pq" role="p ...
- ubuntu中 VI 方向键、删除键问题
这两天重新装的ubuntu系统,发觉使用VI时,方向键按下去后变成ABCD,删除键无效.网上搜寻一番,应该是VI软件本身的问题,顾卸载重装即可,步骤如下: 1.执行命令 sudo apt-get re ...
- winform 控件半透明设置
1.backcolor属性为color.FromArgb(100, 220, 220, 220); 2.全透明设置为transparent方法.
- # ML学习小笔记—Gradien Descent
关于本课程的相关资料http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17.html 根据前面所为,当我们得到Loss方程的时候,我们希望求得最优的Loss方 ...
- springMVC js等文件找不到解决方法
<mvc:resources mapping="/javascript/**" location="/static_resources/javascript/&qu ...
- ASP.NET MVC如何使用输出缓存
通过这篇文章你将学习到在MVC中如何使用输出缓存,业务逻辑我就不多介绍了,主要是Outputcache的基本使用.至于数据缓存还是等我的下一篇文章吧,一步一步来不急的. 输出缓存的使用方法是在Co ...
- WCF身份验证二:基于消息安全模式的自定义身份验证
使用X509证书进行身份验证应该说是WCF安全模型中最”正常”的做法, 因为WCF强制要求使用证书加密身份数据, 离开了证书, 所有的身份验证机制拒绝工作, WCF支持的身份验证机制也相当复杂, 这里 ...
- BZOJ4345 POI2016Korale(构造+堆+线段树)
注意到k与n同阶,考虑构造一种枚举子集的方式,使得尽量先枚举较小的子集.首先sort一下,用堆维护待选子集.每次取出最小子集,并加入:1.将子集中最大数ai替换为ai+1 2.直接向子集中添加ai+1 ...
- 菜单 & 工具栏 & 状态栏
MFC中ON_UPDATE_COMMAND_UI和ON_COMMAND消息区别 CCmdUI 加载状态栏 加载工具栏