#2017 Multi-University Training Contest - Team 2 1011

探讨了在二维平面上由整点构成的正多边形计数问题,通过枚举点并验证是否存在对应的正方形顶点来解决,采用set进行高效查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“劝退赛第二场”
这里写图片描述
# HDU 6055 Regular polygon
题意:二维平面上给你一些整点(关键),求组成的正多边形个数。

分析:整点很关键,在平面上构成的正多边形只有正四边形(证明链接)。这样一来问题就简单很多啦,只需要枚举任意两个点,由此获得其他两个点然后判断能否在 INPUT 中找到。对于查找可以使用 set + count( ) / 二分查找,俱乐部有人用 map 却一直 TLE 。
代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const ll N = 505;

struct node {
    int x;
    int y;
    bool operator<(const node a) const {
        if(x == a.x)return y < a.y;
        else return x < a.x;
    }
} a[N];

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n;
    while(cin>>n){
        int ans=0;
        set<node> ss;
        for(int i=0;i<n;i++){
            cin>>a[i].x>>a[i].y;
            ss.insert(node{a[i].x,a[i].y});
        }

        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                int x1,y1,x2,y2;
                 x1 = a[i].x + (a[i].y - a[j].y);
                 y1 = a[i].y - (a[i].x - a[j].x);
                 x2 = a[j].x + (a[i].y - a[j].y);
                 y2 = a[j].y - (a[i].x - a[j].x);
                 if(ss.count(node{x1,y1}) && ss.count(node{x2,y2}))
                    ans++;

                 x1 = a[i].x - (a[i].y - a[j].y);
                 y1 = a[i].y + (a[i].x - a[j].x);
                 x2 = a[j].x - (a[i].y - a[j].y);
                 y2 = a[j].y + (a[i].x - a[j].x);
                if(ss.count(node{x1,y1}) && ss.count(node{x2,y2}))
                    ans++;
            }
        }
        cout<< ans/4 <<endl;
    }
    return 0;
}

JNU ACM ICPC
WYC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值