C - Line-line Intersection

 Gym - 102220C 

题意:给出n条直线,问交点个数

Example

input

Copy

3
2
0 0 1 1
0 1 1 0
2
0 0 0 1
1 0 1 1
2
0 0 1 1
0 0 1 1

output

Copy

1
0
1
//1:取一对边,将问题化为无向图的模型
//2:用pair和map类型将过程模拟
//数学知识太过于匮乏,代码能力弱,图论数论了解少
//用scanf 不要用cin
#include <bits/stdc++.h>

using namespace std;
const int N = 1e6 + 10;
typedef long long ll;
typedef pair <double, double> pdd;
int t;
ll n;
pdd a[N];
map <double, ll> ma;//一个映射的数据类型
map <pdd, ll> mb;
int main()
{
    scanf("%d", &t);
    while (t--)
    {
        ma.clear();
        mb.clear();
        ll ans;
        scanf("%lld", &n);
        for (int i = 1; i <= n; i++)//第一步:将所有的斜率和截距放入pair-a[i]中
        {
            int x1, x2, y1, y2;
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            if (x2 == x1)
            {
                a[i].first = 2e9 + 1;//斜率
                a[i].second = x1;//截距
            }
            else
            {
                a[i].first = 1.0 * (y2 - y1) / (x2 - x1);//斜率
                a[i].second = y1 - (a[i].first * x1);//截距公式
            }
            
            ma[a[i].first]++;//第二步骤:将截距放入ma中,将这个pair放入mb中
            mb[a[i]]++;
        }
        ans = n * (n - 1) / 2;//第三步:求出总数
        for (int i = 1; i <= n; i++)//第四步:将斜率相同的东西全部减去
        {
            if (ma[a[i].first] > 1)
            {
                ll tmp = ma[a[i].first];
                ans -= tmp * (tmp - 1) / 2;
                ma[a[i].first] = 0;
            }

        }
        for (int i = 1; i <= n; i++)//第五步:将斜率相同并且截距相同的再加上
        {
            if (mb[a[i]] > 1)
            {
                ll tmp = mb[a[i]];
                ans += tmp * (tmp - 1) / 2;
                mb[a[i]] = 0;
            }
        }
        printf("%lld\n", ans);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值