AtCoder Beginner Contest 218 D - Rectangles

题目大意

平面上有n个点,问你这n个点能组成多少个四条边都是平行于x轴或y轴的矩形。

思路

对这n个点排序,x小的在前,x相同的时候y小的在前。
然后对于所有xi相同的点,用map记录可能存在的边<yi, yj>的个数,很明显,xi相同的情况下,<yi, yj>是平行于y轴的,如果边<yi, yj> 的个数为m,那么能组成的矩形的个数为C ( 2 m ) \binom{2}{m} (m2),也可以直接理解成m - 1 + m - 2 + … 3 + 2 + 1,即第一条边可以与其后面的m - 1条边组成矩形,第二条边可以与其后面的m - 2条边组成矩形,以此类推,这个方法就是O(n)的了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
unordered_map<pair<int,int>, int>mp;
 
struct node
{
    int x, y;
    bool operator < (node j)
    {
        if(x == j.x)
        {
            return y < j.y;
        }
        return x < j.x;
    }
}p[2005];
 
int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d", &p[i].x, &p[i].y);
    }
    sort(p, p + n);
    int ans = 0;
    for(int i = 0; i < n; i++)
    {
        int pos = i + 1; // 找与p[i].x相同的点
        while(pos < n && p[pos].x == p[i].x)
        {
            pos++;
        }
        for(int j = i; j < pos; j++)
        {
            for(int k = j + 1; k < pos; k++)
            {
                int y1 = p[j].y;
                int y2 = p[k].y;
                ans += mp[make_pair(y1, y2)];
                mp[make_pair(y1, y2)]++;
            }
        }
        i = pos - 1;
    }
    printf("%d\n", ans);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值