题目描述--> P1959 遗址_NOI导刊2009普及(6)

普通方法分析:

因为题目要求是找最大正方形(如果是长方形更麻烦.

讲真,题目不难,耗时间!

根据题目要求,我们要找的是正方形.

我们可以根据已知两点去判断其他两点是否存在

然后就到了画图课讲解法的时候.

下面所有的dely代表纵坐标差值,delx代表横坐标差值.

(记得在输入的时候,标记圆柱坐标.

当我们枚举的两个点所在直线平行于x轴或y轴的时候↓.

直线两侧均可能有正方形

(即横坐标差值为0纵坐标差值为0的时候.)

纵坐标相同的话,加减横坐标差值即可.

这时只需要判断其他位置点是否存在即可.

我们的难点在于如何判断两个点是倾斜的情况.

容易发现一个将一个倾斜正方形围起来之后,四个三角形是相等的. 像这样↓

很明显全等吧!证明过程略

然后我们需要考虑的是两个点所在直线斜率是正还是负的问题

(亲测只考虑一种情况,不能AC此题.)

求斜率的公式: k=Δy/Δx

分母不能为0!

然后我们又开始画图 emmm

斜率为负有两种情况.我们可以画图如下↓

斜率为正.同样有两种情况如下↓

按照图片去写代码即可.

--------------------代码---------------------

#include<bits/stdc++.h>
#define IL inline
#define RI register int
IL void in(int &x)
{
int f=1;x=0;char s=getchar();
while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
while(s<='9' and s>='0'){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,x[30008],y[30008];
bool res[6008][6008];
int ans;
IL int dis(int a,int b){return abs(a-b);}
IL bool ok(int x,int y)
{
if(x<0 || y<0 || x>5000 || y>5000 || !res[x][y])return false;
return true;
}
IL void search(int px,int py,int nx,int ny)
{
int delx=dis(px,nx),dely=dis(py,ny);
if(delx==0)
{
if(ok(px+dely,py) && ok(nx+dely,ny))
ans=std::max(ans,dely*dely);
else if(ok(px-dely,py) && ok(nx-dely,ny))
ans=std::max(ans,dely*dely);
}
else if(dely==0)
{
if(ok(px,py+delx) && ok(nx,ny+delx))
ans=std::max(ans,delx*delx);
else if(ok(px,py-delx) && ok(nx,ny-delx))
ans=std::max(ans,delx*delx);
}
else if(((ny-py)/(nx-px))<0 && nx-px!=0)
{
if(ok(px+dely,py-delx) && ok(nx-dely,ny-delx))
ans=std::max(delx*delx+dely*dely,ans);
else if(ok(px+dely,py+delx) && ok(nx+dely,ny+delx))
ans=std::max(delx*delx+dely*dely,ans);
}
else if(((ny-py)/(nx-px))>0 && nx-px!=0)
{
if(ok(px+dely,py-delx) && ok(nx+dely,ny-delx))
ans=std::max(delx*delx+dely*dely,ans);
else if(ok(px-dely,py+delx) && ok(nx-dely,ny+delx))
ans=std::max(delx*delx+dely*dely,ans);
}
}
int main(void)
{
in(n);
for(RI i=1;i<=n;i++)
in(x[i]),in(y[i]),res[x[i]][y[i]]=true;
for(RI i=1;i<=n;i++)
for(RI j=1;j<=n;j++)
if(i!=j)search(x[i],y[i],x[j],y[j]);
printf("%d",ans);
}

如果RE的话记得判边界,还要判断是否有标记.

可能会有些麻烦,但个人感觉较好理解.

更简单的方法

通过我们的画图.(如果你不知道请向上看图 qwq

我们很容易发现

新点的横坐标,只与dely有关.

新点的纵坐标,只与delx有关.

无论直线如何摆放都是如此.

且对应坐标为一个加一个减.

因此我们可以精简代码成下面这样:

--------------------代码--------------------

#include<bits/stdc++.h>
#define IL inline
#define RI register int
IL void in(int &x)
{
int f=1;x=0;char s=getchar();
while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
while(s<='9' and s>='0'){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,x[30008],y[30008];
bool res[6008][6008];
int ans;
IL int dis(int a,int b){return abs(a-b);}
IL bool ok(int x,int y)
{
if(x<0 || y<0 || x>5000 || y>5000 || !res[x][y])return false;
return true;
}
IL void search(int px,int py,int nx,int ny)
{
int delx=dis(px,nx),dely=dis(py,ny);
if(ok(px+dely,py-delx) &&ok(nx+dely,ny-delx))
ans=std::max(ans,delx*delx+dely*dely);
else if(ok(px-dely,py+delx) && ok(nx-dely,ny+delx))
ans=std::max(ans,delx*delx+dely*dely);
//感觉少考虑了斜率为负的那一种情况,但的确是可以AC的.
/*
我们也可以加上判断斜率为负的情况.
else if(ok(px+dely,py+delx) && ok(nx+dely,ny+delx))
ans=std::max(ans,delx*delx+dely*dely);
else if(ok(px-dely,py-delx) && ok(nx-dely,ny-delx))
ans=std::max(ans,delx*delx+dely*dely);
难道数据水?
*/
}
int main(void)
{
in(n);
for(RI i=1;i<=n;i++)
in(x[i]),in(y[i]),res[x[i]][y[i]]=true;
for(RI i=1;i<=n;i++)
for(RI j=1;j<=n;j++)
if(i!=j)search(x[i],y[i],x[j],y[j]);
printf("%d",ans);
}

里面的delx*delx+dely*dely勾股定理的内容,就不用我多说了吧.

(逃

几何+暴力【p1959】 遗址[NOI导刊2009普及(6)]的更多相关文章

  1. P1959 遗址_NOI导刊2009普及(6)

    题意:平面上n个点(坐标$0\le x,y\le 5000,n \le 3000$) 求以其中四个点为顶点的正方形的最大面积 $O(n^2)$枚举两个点作为当前正方形的对角线 那么如何求出另外两个点呢 ...

  2. 洛谷——P1958 上学路线_NOI导刊2009普及(6)

    P1958 上学路线_NOI导刊2009普及(6) 题目描述 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道.南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从 ...

  3. Luogu [P1958] 上学路线_NOI导刊2009普及(6)

    上学路线_NOI导刊2009普及(6) 题目详见:上学路线_NOI导刊2009普及(6) 这是一道基础的DFS(深搜)题,堪称模板,是新手练习搜索与回溯的好题选. 大致思路:从(1,1)开始搜索,每次 ...

  4. NOI导刊2009 提高一

    zzh大佬给我说导刊的题全是普及难度,然而我..觉得有两道题是提高的 LocalMaxima 题目解析 对于\(i\)这个数,它要想成为LocalMaxima,比它大的要全部放到最后去,比它小的想怎么 ...

  5. NOI导刊 2009 提高二

    开灯 题目大意 对编号为\([i \times a]\)的灯进行操作,找出操作数为奇数的那一个 题目分析 难度: 入门 因为看到操作数为奇数,因此直接进行位运算,做亦或和 打砖块 题目分析 第一眼看上 ...

  6. NOI导刊 2018河南郑州游记

    前言 本蒟蒻来自浙江的弱市弱校,因为不想两年\(OI\)一场空,以及想出去玩,所以与同届大佬一起报了\(NOI\)导刊,希望能留下点不错的记忆吧. \(Day\ 0\) \(10\)月\(1\)日 经 ...

  7. NOI导刊总结

    NOI导刊总结 前两天去郑州,参加了什么NOI导刊的培训,然后就发现大佬是真的多,还十分意外的发现了一个事,清华北大是不是发笔记本和耳机,为啥三个老师的都一模一样... 这几天主要以讲.NOIP知识点 ...

  8. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  9. 洛谷 P1952 火星上的加法运算_NOI导刊2009提高(3)

    P1952 火星上的加法运算_NOI导刊2009提高(3) 题目描述 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限.她想向你求助,作为一位优秀的程序员,你当然不会拒 ...

随机推荐

  1. 【题解】SDOI2016征途

    就放个代码吧……实在是太套路了.不过据说有复杂度还要低很多的算法,不知道是怎么做呀…… #include <bits/stdc++.h> using namespace std; #def ...

  2. 【题解】JSOI2010满汉全席

    ~bzoj1823 第一次接触2-SAT——SAT,即适定性(Satisfiability)的缩写.像名称所说,即满足需求的可能性问题,而k-SAT即每个人有k种需求,已经证明k>2时是一个NP ...

  3. 洛谷 P1251 餐巾计划问题

    题目链接 最小费用最大流. 每天拆成两个点,早上和晚上: 晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边. 早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r ...

  4. [洛谷P3377]【模板】左偏树(可并堆)

    题目大意:有$n$个数,$m$个操作: $1\;x\;y:$把第$x$个数和第$y$个数所在的小根堆合并 $2\;x:$输出第$x$个数所在的堆的最小值 题解:左偏树,保证每个的左儿子的距离大于右儿子 ...

  5. CF893F Subtree Minimum Query 解题报告

    CF893F Subtree Minimum Query 输入输出格式 输入格式: The first line contains two integers \(n\) and \(r\) ( \(1 ...

  6. git查看和操作commit命令

    git reflog 显示所有branch的commit,包括commit和reset,以及已删除的commit.而git log只显示当前branch的commit,不包括已删除的commit gi ...

  7. 【BZOJ 3165】 [Heoi2013]Segment 李超线段树

    所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #in ...

  8. HDU 2126 01背包(求方案数)

    Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. [fzu 2273]判断两个三角形的位置关系

    首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.ph ...

  10. <video>标签的特性

    以前的网页视频 过去还没有HTML5的时候,我们处理网页视频的时候,都是通过Flash插件来实现的,然而,并非所有浏览器都有同样的插件. 现在有了HTML5带来的video元素,开发者能够很方便地将视 ...