LINK:数矩形

题意:给出n个点 求出一个最大的矩形。

矩形可以使斜着的。(不会告诉你样例我算了几年

这道题的一个潜规则 矩形面积都是整数 我也不知道为啥一定是整数 姑且是题目输出的要求吧。

所以用double什么的精度会挂的很惨。

考虑暴力 n^3枚举点 剩下一个点利用一些奇奇怪怪的向量什么的可以计算出来。(难写+TLE

考虑矩形的性质 对边平行且相等还得有一个角是直角 这个性质过于没用。

考虑另一个性质 对角线相等。这个性质就算是一个强性质。

我们n^2枚举点对 可以把对角线拿出来 然后围成矩形对角线中点我们算出来。

最后 排个序 所有长度相等的对角线且相交的矩形我们就可以枚举出来了。

可以复杂度为O(cnt) cnt为矩形的个数 可以证明矩形的个数不超过\(n^{2.5}\)

证明不再赘述。但是毕竟是一道几何题目 所以复习一点几何知识。

首先这道题我们要求出两点的中点 这个可以利用中点坐标公式来计算 即\(x=\frac{x_1+x_2}{2},y=\frac{y_1+y_2}{2}\)

然后 排序 注意到 排过序后我们要把所有中点相同且对角线长度相同的拿出来 暴力枚举哪两个对角线配对。

因为存在不同的角度 矩形大小不同。

最后 求矩形面积,长乘宽 太没水平了 那叫叉积。

点两个知识点:叉积 点积.

两个运算都是向量之间的运算 其中|\(\vec a\)×\(\vec b\)|即为叉积 其运算法则为 |\(\vec a\)×\(\vec b\)|=|\(\vec a\)|\(\cdot\)|\(\vec b\)|\(\cdot\)\(sin\theta\)

其中\(theta\)为向量a和向量b的夹角 可以发现是两个向量所围成的四边形的面积。好像还可以判断向量b在向量a的左右方向。(这个我记不太清了。

当然 对于两个向量 (x,y)×(a,b)=xb-ay

点积:\(\vec a\cdot \vec b\)=\(|\vec a|\cdot |\vec b|\cdot cos\theta\)

暂时看起来点积其实和高中书本的定义是一样的。就这么多。

//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ld long double
#define pb push_back
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1);
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define pii pair<int,int>
#define F first
#define S second
#define mk make_pair
#define P 13331ll
#define mod 1000003
#define RE register
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define ull unsigned long long
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=1510;
int n,cnt;ll ans;
struct wy
{
ll len,x,y,dx,dy;
bool operator <(wy a)const {return len==a.len?x==a.x?y<a.y:x<a.x:len<a.len;}
}t[MAXN*MAXN];
ll x[MAXN],y[MAXN];
inline ll calc(int x,int y)
{
return abs(t[x].dx*t[y].dy-t[x].dy*t[y].dx)>>1;
}
int main()
{
freopen("1.in","r",stdin);
get(n);
rep(1,n,i)
{
get(x[i]);get(y[i]);
rep(1,i-1,j)
{
t[++cnt].len=pf(x[i]-x[j])+pf(y[i]-y[j]);
t[cnt].x=x[i]+x[j];t[cnt].y=y[i]+y[j];
t[cnt].dx=x[i]-x[j];t[cnt].dy=y[i]-y[j];
}
}
sort(t+1,t+1+cnt);
int j=1;
for(int i=1;i<=cnt;i=j)
{
while(t[j].len==t[i].len&&t[j].x==t[i].x&&t[j].y==t[i].y)++j;
rep(i,j-1,k)rep(k+1,j-1,w)ans=max(ans,calc(k,w));
}
putl(ans);
return 0;
}

luogu P3217 [HNOI2011]数矩形的更多相关文章

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

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

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

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

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

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

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

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

  5. [HNOI2011]数矩形

    题目描述 最近某歌手在研究自己的全球巡回演出计划,他将所有心仪的城市都用平面上的一个点来表示,并打算从中挑选出 4 个城市作为这次巡回演出的地点. 为了显示自己与众不同,他要求存在一个矩形使得挑选出的 ...

  6. 2338: [HNOI2011]数矩形 - BZOJ

    因为已经看了一眼题解,知道是算中点和长度,相同时构成一个矩形,所以就把所有的线段算出来,然后排序,相同的就更新答案 为了避免误差,我们都用整数存,中点直接相加就行了,没必要除2,长度也只要平方就行了, ...

  7. BZOJ2338: [HNOI2011]数矩形

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

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

    对于两条线段,若其中点重合,且长度相等,那么它们一定是某个矩形的对角线. N*N地处理出所有线段,排序,对每一部分中点重合.长度相等的线段进行暴力枚举,更新答案. 用 long double 注意EP ...

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

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

随机推荐

  1. 奇妙的 CSS MASK

    本文将介绍 CSS 中一个非常有意思的属性 mask . 顾名思义,mask 译为遮罩.在 CSS 中,mask 属性允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域 ...

  2. java 中Object类中toString()的使用

    1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString() 2. Object类中toString()的定义: public String toString() { return ...

  3. node+express实现简单的增删改查

    var express = require('express'); var bodyParser = require("body-parser"); var cors = requ ...

  4. 递归实现DropDownList层级

    .NET下拉框DropDownList层级实现 这也算是第一篇博客吧,技术比较菜,写得不好,希望各位博友见谅哈,多多提提意见. 今天做电商网站新闻添加的时候,下拉框选择新闻类别觉得太长,又无法定位其准 ...

  5. java 基本语法(十) 数组(三) 二维数组

    1.如何理解二维数组? 数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则,此数组A称为二维数组. 2.二维数组的声明与初始化 正确的方式: int[ ...

  6. 数据可视化之分析篇(八)Power BI数据分析应用:结构百分比分析法

    https://zhuanlan.zhihu.com/p/113113765 PowerBI数据分析02:结构百分比分析法 作者:海艳 结构百分比分析法,又称纵向分析,是指同一期间财务报表中不同项目间 ...

  7. JavaScript 对象的创建和操作

    <script>         // 对象是属性的无序集合,每个属性都是一个名/值对. 属性名称是一个字符串.         // 对象种类         // 内置对象(nativ ...

  8. Unity安卓共享纹理

    前置知识:安卓集成Unity开发示例 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 ...

  9. 使用redis完成秒杀系统原理

    假设秒杀商品数为100,list名称为winner_user 参考视频教程:https://www.imooc.com/video/15167

  10. Ethical Hacking - Web Penetration Testing(13)

    OWASP ZAP(ZED ATTACK PROXY) Automatically find vulnerabilities in web applications. Free and easy to ...