• 画画


    题目大意就是给定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;
    }
    
  • 相关阅读:
    生日蜡烛
    生日蜡烛
    Angular2 and Electron
    NW.js and Electron compared
    Github发布了为桌面应用开发而生的Electron 1.0版本(HTML、CSS和JavaScript)
    哈佛——教育
    国家的强大——小学教师
    (OK)(OK) Fedora23——NS3(MANETs)——Docker(busybox)——genymotion(android)——All is OK
    (OK) ns3—genymotion—android
    android——adb shell——netcfg——get IP address
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754988.html
Copyright © 2020-2023  润新知