Блог пользователя vintage_Vlad_Makeev

Автор vintage_Vlad_Makeev, 11 лет назад, По-русски

Здравствуйте!

Попалась мне вот такая вот задачка. Начал её как-то криво решать, потом заглянул в темы и увидел, что задача на графы. После этого совсем перестал понимать в какую сторону идти.

Подскажите пожалуйста!

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

Я думаю, тебе нужно построить DCEL и посчитать сколько фейсов (граней) в нём содержат 3 вершины.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Проще говоря, построить граф, где вершины — точки пересечения каких-то двух прямых, а ребро есть между двумя точками, если они соединены отрезком. И в таком графе найти количество циклов длины три.

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Рассмотреть все возможные тройки прямых (включая стороны прямоугольника).
Если тройка прямых попарно не параллельна и не пересекается в одной точке, то образуется треугольную область. Если этот треугольник лежит внутри прямоугольника и внутри него нет других точек пересечения, то добавляем к ответу.
Сложность O(n5).

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо!

    Но на полный балл это вряд ли зайдет...

    Я еще думал о чем-то типа добавлять прямые по одной и пересчитывать только те области, которые она поделила, но что-то практическое так и не придумалоь

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Виноват, заметил только N <= 50 :)
      Для N <= 200 мое решение не подойдет.
      Его можно сократить до O(n4), сократив перебор троек-кандидатов до O(n2), но если это и пройдет, то будет на грани TL, вряд ли авторы ожидали такое решение.