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

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

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


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

Задача 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
  • Проголосовать: не нравится

15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
C прямо в лоб считалась, там 100^2*1000 же.
15 лет назад, скрыть # |
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. Если кого интересует - вот код, не судите строго за качество=)
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Да все уже! Прекрасно все оформили! Спасибо за разбор!
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Крутое решение, но задача решается просто сумированием всех углов и одним сравнением.
    • 15 лет назад, скрыть # ^ |
      Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

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

    А если вообще по контесту, то уже начинают надоедать задачи на паросочетание. За 2 контеста их было 3 штуки.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 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.
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 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:)
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Угол PiPi+1Pi+2 равен половине угла PiOPi+2. Из этого свойства вылезание из окружности, когда сумма первых аi превысит 90 градусов. А хорда станет маленькой, когда сумма первых аi превысит 90-asin(l/2) градусов.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Классно! Было бы круче, если еще ссылку на код дали к задачам.
15 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

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

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