标签:平面 turn family for blank alt int printf 传送门
【问题描述】
平面上有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; }
标签:平面 turn family for blank alt int printf 传送门
原文地址:http://www.cnblogs.com/zbtrs/p/7744733.html