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

题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两两枚举对角线即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,tot;
ll ans;
int x[1510],y[1510];
struct node
{
ll len;
int x,y,a,b;
}p[2000000];
bool cmp(node a,node b)
{
return (a.len==b.len)?((a.x==b.x)?(a.y<b.y):(a.x<b.x)):(a.len<b.len);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
ll chaji(ll x1,ll y1,ll x2,ll y2)
{
return x1*y2-x2*y1;
}
ll sqr(int a,int b,int c)
{
return abs(chaji(x[b]-x[a],y[b]-y[a],x[c]-x[a],y[c]-y[a]));
}
int main()
{
n=rd();
int i,j,last,k;
for(i=1;i<=n;i++) x[i]=rd(),y[i]=rd();
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
p[++tot].len=(ll)(x[i]-x[j])*(x[i]-x[j])+(ll)(y[i]-y[j])*(y[i]-y[j]);
p[tot].x=x[i]+x[j],p[tot].y=y[i]+y[j],p[tot].a=i,p[tot].b=j;
}
}
sort(p+1,p+tot+1,cmp);
for(i=1;i<=tot;i++)
{
if(p[i].len!=p[i-1].len||p[i].x!=p[i-1].x||p[i].y!=p[i-1].y)
{
for(last=i;last<=tot&&p[last].len==p[i].len&&p[last].x==p[i].x&&p[last].y==p[i].y;last++);
for(j=i;j<last;j++) for(k=j+1;k<last;k++) ans=max(ans,sqr(p[k].a,p[j].a,p[j].b));
}
}
printf("%lld",ans);
return 0;
}//8 -2 3 -2 -1 0 3 0 -1 1 -1 2 1 -3 1 -2 1
【BZOJ2338】[HNOI2011]数矩形 几何的更多相关文章
- bzoj2338[HNOI2011]数矩形 计算几何
2338: [HNOI2011]数矩形 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1535 Solved: 693[Submit][Status ...
- BZOJ2338: [HNOI2011]数矩形
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标 ...
- 【计算几何】bzoj2338 [HNOI2011]数矩形
对于两条线段,若其中点重合,且长度相等,那么它们一定是某个矩形的对角线. N*N地处理出所有线段,排序,对每一部分中点重合.长度相等的线段进行暴力枚举,更新答案. 用 long double 注意EP ...
- {bzoj2338 [HNOI2011]数矩形 && NBUT 1453 LeBlanc}平面内找最大矩形
思路: 枚举3个点,计算第4个点并判断是否存在,复杂度为O(N3logN)或O(N3α) 考虑矩形的对角线,两条对角线可以构成一个矩形,它们的长度和中点必须完全一样,于是将所有线段按长度和中点排序,那 ...
- bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
题目链接: 2338: [HNOI2011]数矩形 Time Limit: 20 Sec Memory Limit: 128 MB Description Input Output 题意: 思路 ...
- 【题解】Luogu P3217 [HNOI2011]数矩形
原题链接:P3217 [HNOI2011]数矩形 什么??!怎么又是计算几何,您钛毒瘤了-- 这道题真的是毒瘤 凸包?旋转卡壳? 看一下数据,N<=1500? 暴力 没错,就是暴力,N^2没毛病 ...
- luogu P3217 [HNOI2011]数矩形
LINK:数矩形 题意:给出n个点 求出一个最大的矩形. 矩形可以使斜着的.(不会告诉你样例我算了几年 这道题的一个潜规则 矩形面积都是整数 我也不知道为啥一定是整数 姑且是题目输出的要求吧. 所以用 ...
- 【bzoj2338】[HNOI2011]数矩形 计算几何
题目描述 题解 计算几何 由于对角线平分且相等的四边形是矩形,因此我们可以把每条对角线存起来,按照对角线长度和中点位置为关键字排序,这样对于每个相同长度和中点的对角线就排到了一起. 于是对于每段可能形 ...
- [HNOI2011]数矩形
题目描述 最近某歌手在研究自己的全球巡回演出计划,他将所有心仪的城市都用平面上的一个点来表示,并打算从中挑选出 4 个城市作为这次巡回演出的地点. 为了显示自己与众不同,他要求存在一个矩形使得挑选出的 ...
随机推荐
- vue.js源码学习分享(六)
/* */ /* globals MutationObserver *///全局变化观察者 // can we use __proto__?//我们能用__proto__吗? var hasProto ...
- 递归,回溯,DFS,BFS的理解和模板
LeetCode 里面很大一部分题目都是属于这个范围,例如Path Sum用的就是递归+DFS,Path Sum2用的是递归+DFS+回溯 这里参考了一些网上写得很不错的文章,总结一下理解与模板 递归 ...
- Vue中的computed 解读
computed相当于属性的一个实时计算,如果实时计算里关联了对象,那么当对象的某个值改变的时候,同事会出发实时计算.比如: <body id="content"> & ...
- file中的一些常用方法
1.exists();判断文件(目录)是否存在 2.mkdir();创建一级目录:mkdirs()创建多级目录 3.delete();删除文件(目录) 4.isDirectory();判断是否是一个目 ...
- HDU 1754:I Hate It(线段树-单点更新)
题意: 1~N这些人有一些分数,之后有M条操作.要求支持两种操作:更新其中某个人的成绩,查询[A,B]区间内的人的最高成绩. ( 0<N<=200000,0<M<5000 ) ...
- js-控制浏览器和移动端的后退按钮 . popstate
//控制浏览器和移动端的后退按钮 if (window.history && window.history.pushState) { $(window).on('popstate', ...
- Codeforces 597B Restaurant(离散化 + 贪心)
题目链接 Restaurant 题目意思就是在$n$个区间内选出尽可能多的区间,使得这些区间互不相交. 我们先对这$n$个区间去重. 假如有两个区间$[l1, r1],[l2, r2]$ 若满足$l1 ...
- jenkins按角色授权
当一个公司的开发分为多个组或者是多个项目时,不能让所有的开发都公用一个构建,否则将会变得很混乱,为了解决这一问题,jenkins提供了角色授权的机制.每个开发有着对应的账号和权限,可以自行新建.构建. ...
- arch 安装
xfce参考 http://my.oschina.net/u/1408707/blog/182581#OSC_h2_6 chm阅读 – chmsee作为一个苦逼的码农,要忍受各种chm文件的蹂躏,这个 ...
- 利用NSString的Hash方法比较字符串
实际编程总会涉及到比较两个字符串的内容,一般会用 [string1 isEqualsToString:string2] 来比较两个字符串是否一致.对于字符串的isEqualsToString方法,需要 ...