三角形

复制代码
/*
    windows下long long 用I64d,不长记性!
    斜率没有的时候那个赋值不能用-1,因为有可能有斜率为-1的直线(虽然这题数据里没有。要赋成负无穷
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#define INF 1e9+5
using namespace std;
#define ll long long
int n;
double b[100010];
map<double,ll>a;
ll c(int n,int m)
{
    if(n<m)return 0;
    ll s=1,i;
    for(i=n;i>=n-m+1;i--)s*=i;
    for(i=1;i<=m;i++)s/=i;
    return s;
}

int main()
{
    freopen("trokuti.in","r",stdin);
    freopen("trokuti.out","w",stdout);
    scanf("%d",&n);
    ll tot=0,k;
    for(int i=1;i<=n;i++)
    {
        ll A,B,C;
        scanf("%I64d%I64d%I64d",&A,&B,&C);
        if(B==0)
            a[-INF]++;//记录没有斜率的直线
        else 
        {
            double q=(double(A)/B)*1.0;//不是真正的斜率,只是一个比值 
            if(a[q]==0) b[++tot]=q;//tot记录不同斜率直线的种类 
            a[q]++;//斜率同为q的直线有多少条 
        }
    }
    if(a[-INF]) b[++tot]=-INF;//如果有无斜率的直线,那么再加一种斜率 
    ll ans=c(n,3);
    for(int i=1;i<=tot;i++)
    {
        k=a[b[i]];
        ans-=c(k,3);//三边平行或重合 
        ans-=c(k,2)*(n-k);//两边平行或重合 
    }
    printf("%I64d",ans);
    fclose(stdin);fclose(stdout);
    return 0; 
}
复制代码

 

posted @   [lemon]  阅读(175)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
欢迎这位怪蜀黍来到《三角形 - [lemon] - 博客园》
点击右上角即可分享
微信分享提示