noip模拟赛 三角形

【问题描述】

平面上有N条直线,用方程Aix + Biy +Ci =0表示。这些直线没有三线共点的。现在要你计算出用这些直线可以构造出多少三角形?

输入:

第1行:一个整数N(1 ≤ N≤ 300000)。
  下面N行:每行3个整数:Ai, Bi 和Ci,表示对应直线方程的系数。不超过10^9.

对于40%的数据,N ≤1000;
对于100%的数据,N≤300000。

分析:当3条直线两两不平行,并且不相交于一点时,这3条直线就能围成一个三角形.那么任务就变成了选3条这样的直线有多少种方案.一个比较简单的dp,具体可以看:传送门

 

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

ll n, cnt, f[300010][4];
double k[300010], b[300010];

int main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++)
    {
        ll a, b, c;
        scanf("%lld%lld%lld", &a, &b, &c);
        k[i] = (double)(-a) / b;
    }
    sort(k + 1, k + 1 + n);
    for (int i = 1; i <= n; i++)
    {
        if (k[i] != k[i - 1])
            b[++cnt] = 1;
        else
            b[cnt]++;
    }
    f[0][0] = 1;
    for (int i = 1; i <= cnt; i++)
    {
        f[i][0] = 1;
        for (int j = 1; j <= 3; j++)
            f[i][j] = f[i - 1][j] + f[i - 1][j - 1] * b[i];
    }
    printf("%lld\n", f[cnt][3]);

    return 0;
}

 

posted @ 2017-10-27 18:30  zbtrs  阅读(355)  评论(0编辑  收藏  举报