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

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

Посоны, у меня возник вопрос: как строить окружность минимального радиуса, покрывающую заданные точки? Интересуют решения с асимптотикой не более n3. Помнится, где-то обсуждалось, как за O(n) это делать, но там так и не выяснили, верно или нет.

Надеюсь, ни в каком идущем контесте этой задачи нет.

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

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

Хаха, бага. Просто почему-то вспомнилась задача с тимуса Кольцо холода, которую я так решал

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

    Это не обязательно будет искомой окружностью. Пример: остроугольный треугольник.

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

    Это далеко не всегда верно. Например для остроугольного треугольника лучше брать описанную окружность.

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

    как-то тут в общих чертах

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

      Во втором и третьем абзацах части "Linear-time solutions" приведен конкретный алгоритм. Доказательство и полное описание можно найти здесь.

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

      Чтобы найти соответствующие статьи/реализации/просто понятные описания, достаточно походить по ссылкам с википедии или просто погуглить по названию.

      Вот, например: http://www.tcs.tifr.res.in/workshop/nitrkl_igga/randomized-lecture.pdf

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

Вроде был не так давно топик про задачи, где помогает рэндом-шаффл, эта задача там была.

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

    тут но там вроде так и не выяснили, верно это или нет, и честно говоря, местами не очень понятно

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

пользуясь случаем, хотел спросить, покатит ли самопальный метод: переберем бинпоиском искомый радиус — R, затем пересечем плоскости, ограниченные дугами радиуса R, предварительно пошафлив точки (это наподобие пересечения плоскостей). верно, что это будет работать и верно ли, что за NlogR?

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

А вложенный тернарный не покатит?

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

    Покатит. Если определить функцию как f(O) = max(|OAi|), то она будет выпукла вниз, так как функция fi(O) = |OAi| выпукла вниз, а максимум из выпуклых вниз функций — выпуклая вниз функция. А её глобальный минимум будет соответствовать искомому центру оптимальной окружности. Соответственно, алгоритм за O(N log^2 MAX) состоит в нахождении его двум вложенными тернарниками,

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

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

Есть комната прямоугольной формы размером WxH. Один из ее углов находится в точке (0; 0), противоположный — в (W; H). В этой комнате расположено N колонн, заданных своими координатами. Требуется расположить в этой комнате круглый фонтан максимального радиуса. То есть, грубо говоря, найти окружность максимального радиуса, не покрывающую ни одну из заданных точек и не выходящую за пределы заданного прямоугольника.

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

    По-моему со старого ВКОШПа задача. Делаем бинпоиск по радиусу. Теперь понятно что мы всегда можем упереть окружность-ответ в стену(ы) и(или) точку(и). Накидываем все критические окружности и чекаем. Ограничения небольшие все можно в тупую делать.

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

    По-моему, на intuit есть разбор этой задачи

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

    Эта задача с ВКОШП-a 2000 года, здесь ее разбор.

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

Работать будет подольше, чем куб, но как вариант, построить выпуклую оболочку, и пробовать описать все треугольники, из возможных взять минимальный радиус.

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

    не понял, зачем выпуклая оболочка?

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

      Да, я понял, не факт, что она описана вокруг треугольника. Тогда выпуклая оболочка и правда незачем)

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

Интересно, а можно так решать: Пустим градиентный спуск и им будем искать центр окружности. И на каждом шагу считаем максимальное расстояние до центра.

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

    Можно, но уж тогда лучше так. А если еще и золотым сечением это делать, то вообще быстро будет.

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

Смею заметить, что самую малостью усложненная версия (надо немного преобразований к данным применить) этой задачи была в 90м раунде. Вот кстати ссылка на разбор http://codeforces.com/blog/entry/3229.

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

Ставь лайк, если решаешь Codeforces Round #514 ;)

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

    Ставь лайк, если тоже не умеешь читать условия заданий.