题目大意就是给定n个点,然后问你这n个点可以构成多少个矩形(这里每个矩形都是不一样的,即构成矩形的4个点不是完全相同)。做法就是把这n个点能构成的全部对角线都求出来,记录每条对角线的长度和中点坐标,假如枚举到一条对角线该对角线是t,那么能构成的矩形数量就加上mp[t],mp[t]++,表示这对角线的数量加1,下次再遇到相同种类的对角线的话,矩形数量就加上mp[t],因为不算当前枚举到的对角线已经有mp[t]条了,目前枚举到的可以和以前枚举到的每条对角线都构成一个矩形。
#include <map>
#include <cstdio>
using namespace std;
#define pii pair<int,int>
typedef long long ll;
const int MAXN = 1e6 + 5;
const int INF = 0x3f3f3f3f;
map< pair<pii, ll> , int> q;//键是对角线的类型,值是对应种类对角线的个数
int x[1111], y[1111];
ll dis(int x1, int y1, int x2, int y2) {
return (ll)(x1 - x2) * (x1 - x2) + (ll)(y1 - y2) * (y1 - y2);
}
int main() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d %d", &x[i], &y[i]);
ll ans = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j < i; j++) {
pii p = make_pair(x[i] + x[j], y[i] + y[j]);//对角线的中点,不用/2,是为了防止浮点数的误差
pair<pii, ll> t = make_pair(p, dis(x[i], y[i], x[j], y[j]));//求距离不开方也是为了防止误差
ans += q[t];//当前枚举到的对角线,可以和之前的每个同种对角线组成一个矩形
q[t]++;
}
}
printf("%lld
", ans);
return 0;
}