Author: | A. Baranov | Time limit: | 1 sec | |
Input file: | Standard input | Memory limit: | 256 Mb | |
Output file: | Standard output |
Let's consider a configuration of n lines on a plane. The task is to count the maximum number of triangle cells formed as a result of subdivison plane by these lines.
The input begins with a natural number n, followed by exactly n lines. Each line is defined by a pair of distinct points: (Axi, Ayi), (Bxi, Byi).
The output should contain the number of triangles obtained.
It is guaranteed that no two lines coincide.
All input values are integers.
− 104 ≤ (Axi, Ayi, Bxi, Byi) ≤ 104, 3 ≤ n ≤ 300
No. | Standard input | Standard output |
---|---|---|
1 |
|
|
2 |
|
|
Для начала найдем все попарные пересечения имеющихся прямых.
Каждая i-я прямая задается параметрическим уравнением:
{ Xi(p) = Axi + p ⋅ (Bxi − Axi); Yi(p) = Ayi + p ⋅ (Byi − Ayi). .
Для того, чтобы найти точку пересечения двух таких прямых, нам потребуется решить систему уравнений:
{ Xi(pi) = Xj(pj); Yi(pi) = Yj(pj), .
где (pi, pj) — параметры, задающие положение точки на i-й и j-й прямой соответственно.
Такая система либо не имеет решения (если прямые параллельны), либо имеет единственное решение.
Во избежание погрешностей округления, здесь также можно задействовать рациональную арифметику.
Полученные точки пересечения формируют вершины некоторого планарного графа,
а проведенные через них отрезки прямых — его ребра.
Чтобы избежать дубликатов вершин, каждой прямой можно приписать ассоциативный массив вершин,
упорядоченный по ключам, в качестве которых
используются параметры точек пересечения.
Путем последовательного обхода таких массивов можно сформировать списки смежности вершин.
Следующий этап заключается в подсчете циклов, состоящих из трех вершин.
Для этой цели задействуем обход в глубину.
При этом, во избежание повторного включения ранее просмотренных циклов,
можно установить правило, по которому
обход вершин должен осуществляться по возрастанию их индексов/адресов.
Т.е. из k-й вершины можно будет перейти
в l-ю вершину, только если k < l.