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

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

Сегодня завершился второй раунд. Предлагаю обсудить здесь задачи.


Вот краткий разбор тех задач, которые я прочитал на контесте:

Задача A
Думаю, что здесь ничего не надо разбирать, а просто аккуратно написать то, что от Вас требуют

Задача В
Разобьем слово из запроса на буквы - это будет первая доля графа, вторая доля - многогранники. Проведем ребро между вершиной первой доли и вершиной второй доли, если на многограннике есть соответствующая буква. Построим паросочетание. Если для каждой буквы нашлась пара, то увеличиваем ответ.

Задача С
Т. к. НОД(A, B, C) = НОД(НОД(A, B), C), то можно каждую строку матрицы разбить на sqrt(N) блоков и в каждом предпосчитать НОД. Теперь будем отвечать на запросы, проходясь по строкам матрицы честно, а столбцы обрабатывать группами.

Задача D
A - массив заданных чисел
Посчитаем две вспомогательные величины.
SUM1i - сумма чисел с A1 по Ai
SUM2i - сумма чисел Ai, Ai+2, Ai+4 и т.д.
Максимум в первой строке всегда будет A1, а максимум второй строки мы переберем. Понятно, что максимум второй строки можно разместить под A1 и ответ от это не ухудшится. Пусть мы сейчас смотрим на число Ai, тогда вверх точно должно пойти числа с A2 по Ai-1, т. к. мы планируем сделать Ai максимумом во второй строке. Значит мы "под" эти числа можем поставить числа с Ai+1 по A2 * (i - 1). Ответ от этого не ухудшится. Теперь надо оставшиеся числа разбить на пары. Максимальное число в паре поставим вверх, а минимальное - "под" максимальное. Тогда ответ для такой конфигурации будет (A1 + Ai) * (SUM1i - 1 - SUM11 + SUM22 * i - 1 + A1). Из всех конфигураций нужно взять минимум.

Задача Е
SUM - массив сумм префиксов.
Будем решать задачу динамикой. Di, j - максимальная сумма, которую мы можем получить, сделав не более i зачеркиваний и используя первые j чисел.
Di, j = max(Di, j - 1, Di - 1, j - k + SUMj - SUMj - k)
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
C прямо в лоб считалась, там 100^2*1000 же.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А научите меня gcd за О(1) считать? =)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я gcd для уже посчитанных пар в map пихал. В остальном решение в лоб. Зашло.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        ну это же не за О(1), а даже если хешмэп, то можно постараться как можно больше возможнхы различных пар сделать
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Я и не говорю, что это за О(1) работает. Просто оптимизация, которая работает.

          yarrr, видимо, даже без нее сдал.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            я бы не сказал, что это оптимизация, после того, как в мэпе больше 30 элементов становится, это еще медленней будет.
13 лет назад, # |
Rev. 6   Проголосовать: нравится 0 Проголосовать: не нравится

По поводу задачи С - отлично заходило и решение в лоб, у нас было бы 1000 * 100 * 100 * 31 ( количество бит) очень простых операций, что вполне уложилось в ТЛ. 

Задача F.
Тоже, фактически задача на аккуратную реализацию. 
Будем идти по очереди по углам поворота и поддерживать следующие величины: (A, B, C)- коээфициенты прямой , проходящей через левую и правую точки. ИзначальноA = 0, B = 1, C = 0 (прямая y = 0), и окружность изначально имеет вид x2 + y2 = 1 ( для удобства считаем, что центр в начале координат). 
В зависимости от того, от какой стороны будет делать поворот ( левая или правая), повернем с помощью нужной матрицы поворота нормальный вектор прямой (A, B).
Дальше, найдем количество точек пересечения новой прямой и окружности. Если точка лишь одна, то новая точка выйдет за пределы окружности и ответ .
Если точек 2, то возможны 2 ситуации. По условию, все углы у нас больше 0, т.е. текущая тройка точек ( например, стараяПравая, стараяЛевая, новаяПравая) должны образовывать определенный тип поворота - правый для такой тройки и левый для (стараяЛевая, стараяПравая, новаяЛевая). Если это нарушется, то вторая точка пересечения нас не устраивает, и значит ответ будет тоже . Если же ответ не , то пересчитаем новые точки, и найдем расстояние между ними. В зависимости от этого расстояния либо продолжаем процесс, либо выводим 
Важно не забыть про ε и аккуратно написать симуляцию. 

UPD. Если кого интересует - вот код, не судите строго за качество=)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да все уже! Прекрасно все оформили! Спасибо за разбор!
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А ты точно из Индии, если читаешь разборы на русском?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Крутое решение, но задача решается просто сумированием всех углов и одним сравнением.
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Ну я до этого не додумался, поэтому писал в лоб. Вернее, глянул на ограничения и даже не пытался подумать.
      У вас круче)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ага, сидел кодил это решение, даже чудом написал без багов. За исключением того что почему-то решил что надо длину дуги считать, а не хорды. В итоге на контесте пихал-пихал с разными эпсилонами (думал что ошибка в точности), так и не пропихнул. Через 2 дня мне сказали что там хорда и оказалось что первый сабмит был верным, если учесть это.

    А если вообще по контесту, то уже начинают надоедать задачи на паросочетание. За 2 контеста их было 3 штуки.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Problem F:

    If on step I sum of angles is >=90 then Out after I
    If 2*sin((90-sum of angles)/90 * pi/2) is <=l then Reached after I

    I will post proof later from home and in Russian.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Рассмотрим угол OP2P1. Треугольник OP2P1 равнобедренный, значит угол равен углу a1. Аналогично треугольник OP2P3 равнобедренный, значит угол OP3P2 равен углу OP2P3 и равен a1 + a2. Аналогично угол OP4P3 равен a1 + a2 + a3.
       
      В каком случае P4P5 вылезет за окружность? Когда угол наклона P4P5 не меньше, чем угол наклона касательной в точке P4. А касательная, как известно, перпендикулярна радиусу, то есть необходимое и достаточное условие того, что P4P5 вылазит за окружность - сумма всех углов с номерами до 5 была не меньше 90 градусов. Первое утверждение доказано.

      Второе утверждение и того проще: хорда P4P5 опирается на дугу, градусная мера которой равна 180 - удвоенная сумма градусных мер углов с номерами меньше 5. Удвоенная - потому что угол 180 градусов - центральный, а углы ai - вписанные, то есть соответствующие им центральные углы и градусные меры дуг вдвое больше. Формула длины хорды, опирающейся на дугу градусной меры a - 2 * R * sin(a * 0.5), что я выше и написал, предварительно переведя в радианы.

      Хорошая задачка .. для школьной геометрии 8 класса. А на контесте только вызвала батхёрт потому, что очень со скрипом эта школьная геометрия вспоминалась. Ну и как результат - тоже заюзал формулу длины дуги, а не хорды. 
      Fail harder:)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Угол PiPi+1Pi+2 равен половине угла PiOPi+2. Из этого свойства вылезание из окружности, когда сумма первых аi превысит 90 градусов. А хорда станет маленькой, когда сумма первых аi превысит 90-asin(l/2) градусов.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Классно! Было бы круче, если еще ссылку на код дали к задачам.
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Вопрос ко всем решившим, исключительно ради интереса.  Есть способ решить задачу для всех богов одновременно? (Имеется в виду задача В).
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А разве это не то же самое, что решить для одного имени, являющегося конкатенацией всех имён?
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Выдавало ВА7, да и неправильно это.
      AB, AA  - кубики, AB, AB - боги.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Тогда сформулируй условие чётче. Ты, что ли, имеешь в виду, что многогранник можно использовать больше одного раза, а каждую отдельную грань нельзя? А какие-то ещё ограничения на то, что многогранники могут быть так повёрнуты, есть?
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Условие такое: для каждого бога каждый многогранник можно использовать не более одного раза.
          Отдельную грань использовать можно несколько раз для разных богов.
          Просто в вашем предложении получаем, что в левой доле 4 вершины, а в правой - 2  вершины. В любом случае, max matching  != 4.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Тогда тоже просто: если для каждого по отдельности ответ Yes, то и для всех вместе ответ Yes, иначе для всех вместе ответ No.
            • 13 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

              Я так и делал. 
              Изначально вопрос был в том у меня, можно ли решить задачу сразу для всех богов вместе, а не по отдельности, то есть не запускать каждый раз для любого некую F(cubes, god)
              • 13 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                О, теперь я наконец понял, над чем думать :) .
              • 13 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                С любой сложностью ? Главное чтобы не было цикла от 1 до gods ?
                • 13 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  С той, которая уложилась бы в таймлимит и ограничения задачи.
                  • 13 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Всё равно какой-то некорректный вопрос, такой же как утверждение что сложность должна уложиться в ограничения задачи
                    • 13 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      В чем некорректность?
                      Я спросил, есть ли способ решать сразу F(cubes, godes) для всех кубиков и для всех богов одновременно, так чтобы сдать эту задачу на сервере. 
                      Если нельзя - то это же тоже ответ.
                      • 13 лет назад, # ^ |
                          Проголосовать: нравится 0 Проголосовать: не нравится
                        Понятие одновременно не определено, несколько потоков для каждого каждого god, это одновременноо о ?
                        • 13 лет назад, # ^ |
                            Проголосовать: нравится 0 Проголосовать: не нравится
                          ============================
                          Необходима однопоточная функция, которая получает на вход массив gods, массив cubes, и возвращает ответ, при этом ей разрешается использовать некоторые  однопоточные функции, кроме тех, которые умеют решать задачу (cubes, god).
                          • 13 лет назад, # ^ |
                              Проголосовать: нравится 0 Проголосовать: не нравится
                            Инлайним вообще все функции и заменяем рекурсию циклами - и остаётся только main. 
                            • 13 лет назад, # ^ |
                                Проголосовать: нравится 0 Проголосовать: не нравится
                              ======================
                              Спасибо за капитанство и троллинг, но это немного не то, что мне нужно.
                              • 13 лет назад, # ^ |
                                Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

                                ===========================================

                                 Так капитанство или троллинг ?

                                Я сразу сказал, что вопрос некоректный , потому что решение с озвучеными условиями оказалалось не то, что нужно

                                 EDIT форматирование
                                • 13 лет назад, # ^ |
                                    Проголосовать: нравится 0 Проголосовать: не нравится
                                  И то, и то, да и предложенные вами решения не особо меня интересуют.
                                  • 13 лет назад, # ^ |
                                      Проголосовать: нравится 0 Проголосовать: не нравится
                                    Попробую прямым текстом: я не предлагал решений, я пытаюсь сказать что вопрос не имеет смысла
                                    • 13 лет назад, # ^ |
                                        Проголосовать: нравится 0 Проголосовать: не нравится
                                      Попробую сказать тоже открытым текстом. Ваше мнение меня не особо интересует в данном вопросе.
                                      • 13 лет назад, # ^ |
                                          Проголосовать: нравится 0 Проголосовать: не нравится
                                        ============

                                        Твои интересы конечно очень важная и полезная информация на этом форуме.

                                        Слив защитан
                                        • 13 лет назад, # ^ |
                                            Проголосовать: нравится 0 Проголосовать: не нравится
                                          Твои не особо важней, я думаю. И да, заСЧитан.
                  • 13 лет назад, # ^ |
                    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                    (is it so dificult to prevent double posting ?)
                • 13 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Я не уверен, но мне кажется, что автор имеет ввиду : "можно ли как-то использовать то, что нам надо для всех богов найти ответ и тем самым ускорить решение".
                  Вот здесь уже есть над чем подумать :)
                  • 13 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Ну вообще говоря, именно это, какой-нить граф такой построить есть возможность или нет.