1 条题解
-
0
自动搬运
来自洛谷,原作者为

沉石鱼惊旋
已完成今日我对着铁质的凳子踢了五下然后把那堆钢栏杆在地上滚了一下然后把椅子夹在了篮筐上大学习搬运于
2025-08-24 21:32:19,当前版本为作者最后更新于2022-10-04 18:46:10,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
前言
CSP-J 模拟赛教练放的一道原题,赛时 AC 了听同学说洛谷有,回来写题解。
题目思路
如何找到正方形的四个顶点
最简单的最容易思考到的方法: 或 枚举四个顶点。
但由于 ,肯定超时,复杂度肯定要控制在 左右。
意味着枚举两个点,我们来观察一下这两个点与另外两个点的位置关系。

如图所示,我们将左上顶点定为 ,左下顶点对应 ,那么可以发现如下关系:
-
标红段为 与 的横坐标差,正好为左下顶点与右下顶点的纵坐标之差。
-
标蓝段为 与 的纵坐标差,正好为左下顶点与右下顶点的横坐标之差。
如此,我们即可仅仅通过两个点推出其余两个点的坐标。
如何求面积
前置知识:勾股定理 。

把连接 和 的虚线以及红蓝两线当做一个直角三角形,我们把蓝线想成 ,红线想成 ,那么虚线长度即正方形的边长,即为 。再根据正方形面积公式,正方形面积为 。
完整代码
#include<bits/stdc++.h> #define max(a,b) a>b?a:b using namespace std; bool f[5020][5020]; int x[3020]; int y[3020]; int n,m; int main() { // freopen("ruin.in","r",stdin); // freopen("ruin.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",x+i,y+i); f[x[i]][y[i]]=1; } int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int a=x[i]-x[j]; int b=y[i]-y[j]; int Ax=x[i]-b; int Bx=x[j]-b; int Ay=y[i]+a; int By=y[j]+a; if(Ax<1||Ax>5000||Bx<1||Bx>5000||Ay<1||Ay>5000||By<1||By>5000)continue; if(f[Ax][Ay]&&f[Bx][By]) { ans=max(ans,a*a+b*b); } } } printf("%d\n",ans); return 0; } -
- 1
信息
- ID
- 925
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者