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

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

Уважаемые КФ-цы! Сегодня прошла 2 командная олимпиада на сайте http://acmp.ru/asp/champ/index.asp?main=tasks&id_stage=40501 (Ссылка на условия). Может кто нибудь подскажет как правильно решать задачи В (Деление) и Н (Паутина). Спасибо.

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

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

Задачу B мы решали следующим образом: брали точку центра и строили прямые через нее и все остальные по очереди. Каждый раз проходили по всем точкам, отмечая, с какой стороны от прямой они лежат. Если точка лежала на прямой, то смотрели еще относительно прямой, перпендикулярной первой. Ну и если ответ существовал, то либо все точки лежат по одну сторону от первой прямой, либо если встретились точки на ней, то смотрели на результаты второй. // Правда сдать так и не успели

В H просто сортировали по убыванию высот и проходили по каждому горизонтальному отрезку, пересекающему текущую позицию.

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

    Так а где уверенность, что она у Вас правильно решена, если не успели сдать. Я тоже проводил вертикальную прямую и горизонтальную, которые делили квадрат на два прямоугольника одинаковой площади и считал точки, все ли с одной стороны от прямой. Но разрез может быть произвольным. Так я двигал точки с шагом по противоположным сторонам квадрата, по одной стороне вниз, по второй вверх. Строил прямые и считал для каждой прямой расположение точек. WA 15 вышло. По сторонам ходил с шагом 1, и 0,1, и 0,01 и ничего не вышло.

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

      Уверенности никакой и нет, вот была б дорешка...

      Мы предполагали, что разрез пройдет бесконечно близко к одной из точек, поэтому и проводили через каждую. Из-за этого приходилось использовать перпендикулярную прямую. Типа можно подвинуть эту прямую на бесконечно малое расстояние при двух точках, лежащих на самой прямой, если они лежат по одну сторону от центра.

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

По крайней мере задача H это боян. Паутина
А еще нам ее на город давали) В 2012 или 2013

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

Я не участвовал, но могу предложить решение задачи B:

Скажем, что разрез можно провести от центра до какой-нибудь свечи. Возьмем вектор от центра квадрата до свечи. Теперь как проверить с какой стороны лежит свеча? Возьмем вектор от центра до выбранной свечи и посмотрим на векторное произведение (ax * by - ay * bx) — значение <0 для одной половины и >=0 для другой.

Проверим, что мы можем найти разрез, для которого количество свечей на любой из сторон равно 0 ( UPD: лучше просто посмотреть, что все векторные произведения одного знака). Асимптотика — O(M2)

Так как делений нет, все операции можно делать в целых числах => нет проблем с точностью. Извиняюсь, если я неправ)

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

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

    4 2

    1 3

    3 1

    NO

    А центр, кстати, может стать нецелым числом, если сторона нечетной длины

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

Как решать G?

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

А я тогда заодно спрошу еще нормальное решение Е. Мы таких там костылей понаставили, что мне аж стыдно, что зашло

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

    Посчитаем факториалы всех чисел от 1 до 100000 по модулям 109 + 7 и 109 + 9, посчитаем число из инпута по тем же модулям.

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

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

      Ох, действительно, так было значительно проще... Удивлен даже, что не дошли до этого на контесте.

      Спасибо

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

Задачу В решал так: Что бы разрезать торт на 2 равные части, линия разреза обязательно пройдет через центр торта. Тогда переберем все прямые проходящие через центр: будем строить прямую по двум точкам, одна из которых в центре квадрата, а вторая находится на (допустим) нижней стороне.

Координаты первой точки n / 2, n / 2.

Координаты второй точки i, 0, где i перебираем от 0 до n c шагом 0.01.

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

P.S. Да, решение через double, поэтому могли возникнуть проблемы с точностью. Но тем не менее зашло с первого раза=)