贤鱼的刷题日常--P1665 正方形计数--题目详解

简介: 🍀学习了解--P1665 正方形计数
🏆今日学习目标:
🍀学习了解--P1665 正方形计数
✅创作者:贤鱼
⏰预计时间:5分钟

请添加图片描述

题目

正方形计数

题目描述

给定平面上N个点,你需要计算以其中4个点为顶点的正方形的个数。注意这里的正方形边不一定需要和坐标轴平行。

输入格式

第一行一个数X,以下N个点的坐标。

【数据规模】

对于20%的数据,满足1≤N≤20;

对于100%的数据,满足1≤N≤500; -50≤X[i],Y[i]≤50,点不会重叠。

输出格式

一个数表示正方形的个数。

样例 #1

样例输入 #1

7
0 0
0 1
1 0
1 1
1 2
2 1
2 2

样例输出 #1

3

思路

这个题的难点就在于如何压缩时间复杂度
我们枚举四个顶点来判断当然可行,但是n^4绝对炸了

注意题干正方形
那我们枚举对角,判断剩下两个角,然后判断剩余两个叫的位置,如果有这两个顶点,答案++

n^做法
在这里插入图片描述
可以看到,这是一个正方形,我们可以枚举点A,点B,是不是就可以找到线段终点o了
线段终点公式:(x1-x2)/2,(y1-y2)/2
众所周知:正方形对角线互相垂直平分,并且四边相等
求出中点坐标(mdx,mdy)

==注意==:我们这里过o,做x轴,y轴平行线
在这里插入图片描述

过C,B做垂直,可以证明▲CEO≌▲BFO(AAS)
所以EO=OF,BF=EC
我们枚举AB,所以AB坐标是知道的
我们设A(ax,ay),B(bx,by)
所以c到y轴的距离就是mdx-(mdy-ay)
所以c到x轴的距离就是mdy+(mdx-ax)
所以d到y轴的距离就是mdx+(mdy-ay)
所以d到x轴的距离就是mdy-(mdx-ax)

题目最难的部分就做完了,接下来的细节代码中展示

AC代码

#include<cmath>
#include<iostream>
#include<cstring>
#include<iostream>
using namespace std;
int mp[1105][1105];
int n,ans=0;
int x[500011],y[510001];
int mdx,mdy;
int cx,cy,dx,dy;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i];
        x[i]=(x[i]+51)<<1;//这里先*2,后面算中点/2的时候可以避免小数,同时+51避免负数
        y[i]=(y[i]+51)<<1;//左移的意思是*2,左移2就是*2*2
        mp[x[i]][y[i]]=1;
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            mdx=(x[i]+x[j])/2;
            mdy=(y[i]+y[j])/2;
            cx=mdx-(mdy-y[i]);
            cy=mdy+(mdx-x[i]);
            dx=mdx+(mdy-y[i]);
            dy=mdy-(mdx-x[i]);
            if(cx<=0||cy<=0||dx<=0||dy<=0) continue;//+51了就不会有0,所以判断一下
            if(mp[cx][cy]&&mp[dx][dy]==1){
                ans++;
            }
        }
    }
    cout<<ans/2;
}

请添加图片描述

相关文章
|
6月前
|
C++
【洛谷 P2241】统计方形(数据加强版)题解(循环枚举)
该题目是1997年普及组的一道编程题,要求计算$n\times m$棋盘中的正方形和长方形数量(不计正方形)。输入包含两正整数$n,m\leq 5000$。输出为一行,两个正整数分别表示正方形和长方形数量。示例输入`2 3`,输出`8 10`。解题思路是将矩形数拆分为正方形数和长方形数,然后通过双重循环计算。AC代码使用C++编写,通过累加方法得出结果。
62 0
|
5月前
|
人工智能
【洛谷】P3853 路标设置
洛谷P3853 路标设置
45 0
【洛谷】P3853 路标设置
|
4月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
51 0
|
7月前
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
|
7月前
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
45 0
|
7月前
|
算法
【力扣热题100】287. 寻找重复数(弗洛伊德的乌龟和兔子方法)
【力扣热题100】287. 寻找重复数(弗洛伊德的乌龟和兔子方法)
75 0
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
70 0
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
代码随想录刷题|LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球