画画

题目大意就是给定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\n", ans);
	return 0;
}

 

posted @ 2018-08-08 14:47  eason99  阅读(89)  评论(0编辑  收藏  举报