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

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

С 16 марта по 21 апреля 2019 г. Институт компьютерных технологий и информационной безопасности Южного федерального университета проводит III Открытый Чемпионат Юга России "ContestSFedU-2019".

В этом году в соревновательную программу входят шесть турниров:

  • Командный турнир по спортивному программированию (все желающие, команда из 2-3 чел, очный финал 21-го апреля);

  • Турнир школьников (школьники 9-11 классов и студенты колледжей; победители и призеры турнира получают льготы при поступлении в ЮФУ);

  • Турнир игровых стратегий Code Warriors Challenge (команда из 2-3 чел, без ограничений)

  • Турнир Junior Contest (школьники не старше 8 класса, не имеющие серьезного опыта участия в олимпиадах по программированию);

  • Турнир по программированию на языке Scratch (школьники не старше 6 класса);

  • Личный турнир по спортивному программированию (для студентов ЮФУ).

Каждый турнир проводится в 2 этапа: отборочный онлайн-тур (16-18 марта) и очный финал в г. Таганроге (19-21 апреля). Тестирующая система — codeforces.com.

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

Регистрация участников (до 15.03.2019), подробная информация о Чемпионате, правилах проведения турниров, зарегистрировавшихся участниках, порядке отбора финалистов, а также архив с материалами прошлых лет – на сайте Чемпионата www.contestsfedu.org.

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

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

Финал прошлогоднего командного турнира $$$^{CONTEST}_{SFEDU} 2018$$$ теперь доступен в тренировках!

2018 Открытый чемпионат Юга России по спортивному программированию – XII Олимпиада ЮФУ «ContestSFedU-2018». Финал командного турнира.

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

Отбор закончился, предлагаю обсудить задачки. Как решать F?

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

    Во первых, расположим все вершины так, чтобы слева направо их высоты убывали.

    Теперь важный факт — как бы мы не расставляли подъёмники, в любом случае нам придётся поехать из последней вершины в первую, возможно с помощью нескольких подъёмников.
    Заметим, что если мы разделим путь из последней вершины в первую на два, остановившись где-то, то тогда мы сможем забрать всех людей с какой-то дополнительной вершины.
    Если мы сделаем такие остановки во всех вершинах между первой и последней, то у нас уже будет хороший ответ и мы сможем добраться из любой вершины в любую другую.

    Теперь подумаем, а какие остановки нам реально нужны. Немного порисовав на бумажке становится понятно, что остановки нужны во всех вершинах, в которые не входит ни одно ребро (кроме первой вершины). Это так, потому что мы не сможем попасть в неё из первой вершины. Также нам нужны подъёмники из всех вершин, из которых не выходит ни одно ребро, потому что надо же как-то оттуда выбираться.
    Если мы сделаем такой маршрут, который идёт от последней вершины к первой, по пути собирая все вершины, описанные выше, мы и получим оптимальный ответ.

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

А как решать последнюю задачу (G) из командного отборочного тура? У меня были идеи строить какую-то частичную выпуклую оболочку или всякие динамики, но всё упиралось в то, что считаются такие штуки за квадрат, а быстрее как — не понятно.

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

    Будем строить две выпуклые оболочки по левым и правым границам ворот так, что бы они всегда начинались из одной точки. Начнём из точки (0; 0) и будем рассматривать ворота в порядке увеличения координаты Y. Пусть при добавлении ворот 1, 2 и 3 проблем не возникает и тогда мы переходим к следующим. А при добавлении ворот 4 оболочки пересекаются.  Заметим, что левая оболочка теперь не является корректным путём, так как не проходит через все ворота. Её можно очистить. В качестве новой стартовой точки будем рассматривать все точки в правой оболочке начиная с первой. Если при текущей точке оболочки продолжают пересекаться, то удаляем эту точку, а к ответу прибавляем расстояние до следующей.  Таким образом, новой стартовой точкой будет правая граница вторых ворот, а к ответу будет прибавлено расстояние между точками (0, 0) и правой границей первых ворот и расстояние между правыми границами ворот 1 и 2. Все ворота будем рассматривать подобным образом и в конце рассмотрим ворота, состоящие из точки (0, Q). После этого в оболочках останутся две точки, расстояние между которыми нужно прибавить к ответу (в обоих оболочках это будут одни и те же точки).

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

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

Командный турнир. Задача D: Чего не хватает в данном алгоритме?

  1. Сортируем кольца по X.
  2. Проверяем соответствие критериям каждой пары соседних колец.
  3. Если все критерии соблюдены, то выводим изначальный номера колец по порядку отсортированного массива, иначе выводим NO.

Задача B: Есть ли шансы на прохождение всех тестов с использованием алгоритма Pisinger'a? (Пока что прошел только до 23 теста)

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

    Алгоритм правильный, но только во втором пункте может быть проблема. Как именно Вы проверяли каждую соседнюю пару на правильность?

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

      (D^2 < (R1+R2)^2) && (D^2 > (R1-R2)^2) && (y2<y1) (y2>y1 если это четная пара колец), где D^2=((x1-x2)^2+(y1-y2)^2)

      P. S. Решение проходит до 26 теста.

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

        1) В каком типе данных Вы вычисляете?

        2) Проверяйте ли Вы то, что соседние окружности не имеют одну координату X?

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

В этот раз год ждать не нужно: $$$^{CONTEST}_{SFEDU} 2019$$$ доступен в тренировках!

Открытый чемпионат Юга России - ContestSFedU 2019, финал командного турнира

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

Есть идеи как решать задачу E из отборочного командного (про количество размещений колец)? В общем случае вроде нашел комбинаторную формулу, но не получилось для крайних случаев решить.

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

    У меня трёхмерная дп N * M * 5.

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

    dp[x][y][i] — кол-во способов разместить i колец при условии, что i-ое кольцо будет иметь координату {x, y}

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

      Почему-то не подумал про дп, спасибо большое, попробую