codeforces contest 1163 C2. Power Transmission (Hard Edition)---计算几何

博客给出Codeforces题目C2的链接及题解,指出最多有n*(n - 1)条直线,可暴力枚举判断相交,将直线按斜率划分,去掉重复直线,计算每个斜率的贡献。还提到学习了pair和map用法,对截距计算类型有疑问。

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

题目链接:https://codeforces.com/contest/1163/problem/C2

题解:最多有n*(n-1)条直线,可以暴力的去枚举判断直线是否相交,同一平面内的两条直线不平行即相交,所以将所有的直线按斜率划分,相同斜率中去掉重复的直线,每个斜率的贡献就是:该斜率的直线数*(总的直线数(不算重合的)-该斜率的直线数)。

感觉这道题主要是让我学了下pair和map的用法,还有代码中截距的计算,题解是整型,但我没想通,感觉应该是double才对,但不知道万一出精度锅怎么办。。

#include<bits/stdc++.h>
#define ll long long
#define pr pair<ll, ll>
using namespace std;

const int maxn = 1e3+5;

struct Point{
    ll x, y;
}p[maxn];

map<pr, ll>cnt;
map<pair<pr, double>, bool>vis;

int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> p[i].x >> p[i].y;
    }
    ll m = 0;
    cnt.clear();
    vis.clear();
    for(int i = 0; i < n; i++){
        for(int j = i+1; j < n; j++){
            ll a = p[i].y - p[j].y;
            ll b = p[i].x - p[j].x;
            double c = 1.0*(p[i].y*p[j].x - p[i].x*p[j].y);
            ll d = __gcd(a, b);
            a /= d;
            b /= d;
            c /= d*1.0;
            if(a < 0 || (a == 0 && b < 0)){
                a = -a, b = -b, c = -c;
            }
            pr tmp = make_pair(a, b);
            if(!vis[make_pair(tmp, c)]){//去掉重合的直线
                vis[make_pair(tmp, c)] = true;
                cnt[tmp]++;
                m++;//统计总的直线数
            }
        }
    }
    map<pr, ll>::iterator it;
    ll ans = 0;
    for(it = cnt.begin(); it != cnt.end(); it++){
        ll tmp = cnt[it->first];
        ans += tmp * (m-tmp);
    }
    ans /= 2;
    cout << ans << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值