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

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

Давайте обсудим задачи. =) Очень интересует геометрия. (5ая задача)

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

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

у нас там ошибка в 5 знаке была из-за погрешности ((

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

На ответ влияли только радиус, расстояние от центра сферы до человека, от центра сферы до источника света, и угол между этими лучами. Поэтому мы можем свести задачу к плоской: в (0,0) — центр сферы, в (r1,0) человек, в (r2cos(φ), r2sin(φ)) источник. Угол, под которым из центра выходит луч, проходящий через точку отражения переберем бинопоиском. По нему считается альфа. Бета считается очевидно.

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

    а что делать, если wa2?

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

      Я так понял, что в этом тесте может упасть только по точности. Например, если использовать в бинарном поиске какие-нибудь попытки сравнения с eps. Или, например, если делать условие остановки вещественного бинпоиска вместо фиксированного числа итераций.

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

        делался for(it=0;it<300;++it). ниодного епсилона в коде нет.

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

          Может проблема, когда между векторами тупой угол?

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

            а что это даёт? то, что бинарный поиск нельзя применять?

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

              Можно, просто у меня в баг был в этом, который давал ва2

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

У нас прошло вот такое:

  1. Находим стороны треугольника, образованного центром, наблюдателем и источником.
  2. Бинарным поиском находим точку на окружности, через которую отражается луч.

Нужно учесть случай когда все три точки лежат на одной прямой (вроде 3 тест)

UPD: почти тоже самое, что сверху :)

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

    А можно посмотреть код? Писал то же самое решение, постоянно получал WA2.

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

      У нас было WA3, но, возможно, что проблема та же: аргумент для acos по модулю был больше 1 на 1e-19, что вело к nan.

      UPD: Помогло отправить под VS вместо MinGW.

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

      http://pastebin.com/RFhZQx0t A — the observer, B — the light source, C — the center of the circle. a = BC, b = AC, c = AB. Мы перебирали бинпоиском АО (О лежит на АВ) — расстояние от А до пересечения АВ и прямой СI, где I — точка на окружности, через которую отражается луч. Функция для бинпоиска основывается на том, что биссектриса делит сторону в отношении, пропорциональном отношению прилежащих сторон (типа отношение либо меньше одного, либо больше одного)

      Ловили WA3, пока не рассмотрели случай А, В, С лежатъ на одной прямой.

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

Кто как решал, например, задачи 9-ю и про цепную молнию?

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

    Девятая: динамика БФСом. Состояние (до какой вершины дошли, сколько времени провели под солнцем ровно до этого). Кроме очевидных переходов, пытаемся уменьшить время проведённое под солнцем путём прохода по какому-нибудь ребру до тени и обратно.

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

      А как такое бфсом делать вместо Дейкстры? Длины же разные.

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

        Ага. Я неправильно выразился. Получается что-то дейкстро-подобное: достаём из очереди, смотрим все рёбра, если получилось прорелаксировать какое-нибудь состояние, то добавляем его в очередь.

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

          А это случайно не Форда-Беллман с очередью? Я не писап, но ребята говорят у них зашел Форда-Беллман с брэйком.

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

            Пожалуй, нет. Если мне не изменяет память, в Форд-Беллмане на каждой итерации просматриваются все рёбра. А у меня только инцидентные текущей вершине, которая берётся из очереди.

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

              Так это и называется вроде Форд-Беллман с очередью.

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

                А не Левит ли это?..

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

                  Его при желании какой-то Бурундук всегда сломать может. Так что, по аксиомам Эскобара — это так себе алгоритм :)

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

                  "Если обычный Форд-Беллман не проходит, пишите Форд-Беллмана с брэйком. Если и он не проходит, пишите с очередью."

                  Бурундук (с)

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

                  Я не понимаю. Если видно, что Дейкстра (даже за квадрат) проходит, зачем писать Форда-Беллмана?...

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

                   Ну динамика у парней была вроде dp[V][T] = distance, где V-вершина, Т — изнеможденность. Ну и насколько я понял, они гоняли Форда-Беллмана по ней. Ты не мог бы объяснить свое решение поподробней?

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

                  Есть состояния (V,T). Мы для каждого состояния знаем, в какие другие мы можем из него попасть, и сколько нам для этого надо пройти (исходя из смысла задачи).

                  Получается граф на состояниях (V;T). Переход есть, если он есть в динамике, вес равен увеличению distance. Веса неотрицательны, значит Дейкстра работает. Естественно, граф строить явно необязательно.

                  Обычно в динамике граф зависимостей без циклов, поэтому там всё проще. В данной задаче есть циклы, так что это и динамикой сложно назвать...

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

      Можете скинуть код? Писали ровно это, но упорно ловили WA10

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

        Код

        Правда, чуть выше говорят, что если пишешь такой код, то следует опасаться Бурундуков.

        Пользуясь случаем, реквестирую метод взлома.

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

            Тут Бурундук1 как раз советует алгоритм, который отличается от моего только одним ифом.

            И даже без этого ифа, у меня не получилось его сломать приведённым генератором.

            По ссылкам в той же теме нашёл ещё один метод, но и с ним ничего не получилось.

            Вот код

»
10 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится
Когда  писали условие, специально добавили требование, что весь отрезок лежит от центра шара как минимум на удвоенном расстоянии, чтобы не было проблем с погрешностями. А так - да проще всего теорема косинусов + бинпоиск по углу...
»
10 лет назад, # |
Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

Было бы интересно узнать, как решаются задачи 1, 6 и 7.

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

    6: Если забыть про то, что буквы должны идти в том порядке на ломанной, в котором они идут в слове, то можно просто взять ближайшую точку для каждой буквы. Теперь вспомним про порядок букв. Идея в том, что интересных точек на ломанной мало. А именно, посмотрим на подстроку в строке. Найдем для каждого звена ломанной точку, которая минимизирует сумму расстояний до подстроки(там получается кусочно-выпуклая функций, поэтоу можно найти интевалы выпуклости и запустить на каждом тернарник). Запомним все такие точки(по всем звеньям и всем подстрокам). Упорядочим их. Дальше простая динамика: состояние — последняя точка и последняя взятая буква, значение — минимальная возможная сумма. Утверждается, что в другие точки ломанной ничего никогда не надо ставить.

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

    1: Если β составляет угол меньше 45 градусов с направлением на Солнце, то просто ускоряемся одним манёвром в направлении Β. А иначе -- двумя манёврами, как на картинке:

    Странно, что так мало команд её решило. Хехе.

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

    (дубликат)

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

    Почему в 7 нельзя написать что-то совсем тупое? У нас есть состояние d[t][x][y][dir], t — текущее время, от этого параметра можно избавиться, чтобы сэкономить память, х, у — координата, dir — направление, по которому сделали последний ход. Заметим, что монстр как бы разрастается до какого-то большого квадрата возможных местоположений, и нам, видимо, надо провести лучи из углов квадрата и как-то проверить, смогли ли мы прийти в это состояние. Вроде должно укладываться в ТЛ 7 секунд, но писать это, видимо, не очень приятно

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

      Наверное, если в состоянии хранить текущее время в чистом виде, то будут проблемы с тестами, где оно очень большое (ходьба по спирали). Достаточно для каждого остатка от деления времени на (Speed+1) найти минимальное t.

      dir можно не хранить в состоянии. Можно не считать ходы элементаля ходами вообще, просто при выполнении шага непосредственно перед его ходом проверять, не убьёт ли он нас.

      Да, элементаль становится квадратным =) Точнее, в общем случае прямоугольным: за пределы поля он не выходит. Если провести лучи из углов квадрата, то получится некий сектор. Утверждается, что все клетки в этом секторе в опасности. Получается необходимая проверка уклонения за O(1).

      Писать не очень. К тому же, легко забыть какое-нибудь мелкое условие среди длинного текста. Типа "на выходе сразу убегаем" и "по элементалю нельзя ходить" и пр.

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

Между тем вышел список команд, приглашенных на очный тур: http://olympic.nsu.ru/files/Invited_teams_0.pdf

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

    Ограничение на число команд от вуза радует, однако