Имеются два множества точек в декартовой прямоугольной системе координат. Точка с номером i (в условной нумерации) может принадлежать 1-му или 2-му множеству. Какому множеству принадлежит точка заранее известно.
Необходимо попытаться построить такую прямую линию, которая разделяет группу точек множества 1 и множества 2, то есть такую прямую линию, что все точки из множества 1 лежат строго по одну сторону относительно этой линии, а все точки множества 2 — строго по другую. И ответить на вопрос, возможно ли построение такой прямой, либо же нет.
Не допускается построение такой разделяющей линии, на которой лежит какая-либо точка, то есть прямая линия должна разделять группы точек 1-го и 2-го множеств строго.
В первой строке входных данных записано одно целое число n (1≤n≤300) — количество всех точек.
В последующих n строках записаны координаты звезд.
В i-й из этих строк записано три целых числа — , разделенных одним пробелом Здесь
, если точка принадлежит множеству 1, и
в противном случае.
Гарантируется, что входные данные не содержат двух звезд с совпадающими координатами.
В единственной строке выходных данных выведите Yes, если существует разделяющая линия, или No, если разделяющей линии не существует.
Решение строится из двух предположений. Два множества можно разделить гиперплоскостью, если их минимальная выпуклая оболочка не пересекается. А также если одна выпуклая оболочка не находится внутри другой.
Случаи, когда эти свойства не выполняются показаны на картинках.
Итак, решение начинается с построения выпуклых оболочек с помощью метода Джарвиса. Это позволит как сократить количество рассматриваемых точек, так и проверить эти 2 свойства. Далее проверяем пересечение всех полученных отрезков одной выпуклой оболочки с другой. Данную проверку выполняет функция intersect()
Отрезки и
пересекаются тогда и только тогда, когда одновременно выполнены следующие 3 условия:
а) пересекаются ограничивающие их прямоугольники
b)
c)
Второй случай требует рассмотрения нахождения точек одного множества в выпуклой оболочке другой. Данное свойство проверяется слудующим образом. Для того, чтобы точка находиась внутри выпуклой оболочки, необходимо, чтобы было или всегда неотрицательно, или всегда неположительно. Эта проверка не должна выполняться, если минимальная выпуклая оболочка представляет из себя линию.