С 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.
Финал прошлогоднего командного турнира $$$^{CONTEST}_{SFEDU} 2018$$$ теперь доступен в тренировках!
2018 Открытый чемпионат Юга России по спортивному программированию – XII Олимпиада ЮФУ «ContestSFedU-2018». Финал командного турнира.
Отбор закончился, предлагаю обсудить задачки. Как решать F?
Во первых, расположим все вершины так, чтобы слева направо их высоты убывали.
Теперь важный факт — как бы мы не расставляли подъёмники, в любом случае нам придётся поехать из последней вершины в первую, возможно с помощью нескольких подъёмников.
Заметим, что если мы разделим путь из последней вершины в первую на два, остановившись где-то, то тогда мы сможем забрать всех людей с какой-то дополнительной вершины.
Если мы сделаем такие остановки во всех вершинах между первой и последней, то у нас уже будет хороший ответ и мы сможем добраться из любой вершины в любую другую.
Теперь подумаем, а какие остановки нам реально нужны. Немного порисовав на бумажке становится понятно, что остановки нужны во всех вершинах, в которые не входит ни одно ребро (кроме первой вершины). Это так, потому что мы не сможем попасть в неё из первой вершины. Также нам нужны подъёмники из всех вершин, из которых не выходит ни одно ребро, потому что надо же как-то оттуда выбираться.
Если мы сделаем такой маршрут, который идёт от последней вершины к первой, по пути собирая все вершины, описанные выше, мы и получим оптимальный ответ.
А как решать последнюю задачу (G) из командного отборочного тура? У меня были идеи строить какую-то частичную выпуклую оболочку или всякие динамики, но всё упиралось в то, что считаются такие штуки за квадрат, а быстрее как — не понятно.
Будем строить две выпуклые оболочки по левым и правым границам ворот так, что бы они всегда начинались из одной точки. Начнём из точки (0; 0) и будем рассматривать ворота в порядке увеличения координаты Y. Пусть при добавлении ворот 1, 2 и 3 проблем не возникает и тогда мы переходим к следующим. А при добавлении ворот 4 оболочки пересекаются. Заметим, что левая оболочка теперь не является корректным путём, так как не проходит через все ворота. Её можно очистить. В качестве новой стартовой точки будем рассматривать все точки в правой оболочке начиная с первой. Если при текущей точке оболочки продолжают пересекаться, то удаляем эту точку, а к ответу прибавляем расстояние до следующей. Таким образом, новой стартовой точкой будет правая граница вторых ворот, а к ответу будет прибавлено расстояние между точками (0, 0) и правой границей первых ворот и расстояние между правыми границами ворот 1 и 2. Все ворота будем рассматривать подобным образом и в конце рассмотрим ворота, состоящие из точки (0, Q). После этого в оболочках останутся две точки, расстояние между которыми нужно прибавить к ответу (в обоих оболочках это будут одни и те же точки).
Для решения задачи остаётся разобраться ещё с парой вопросов. Как определить, какая оболочка корректна, а какая нет: размер корректной оболочки всегда больше (очевидно, если немного порисовать). Как определить, что оболочки пересекаются: рассмотрим два вектора, которые образуют две первые точки в каждой оболочке. В нормальной ситуации вектор из правой оболочки должен быть повёрнут относительно вектора из левой по часовой стрелке, иначе оболочки пересекаются (для того чтобы проверить это, достаточно посмотреть на знак векторного произведения этих векторов). Время работы линейное. Вроде всё.
Командный турнир. Задача D: Чего не хватает в данном алгоритме?
Задача B: Есть ли шансы на прохождение всех тестов с использованием алгоритма Pisinger'a? (Пока что прошел только до 23 теста)
Алгоритм правильный, но только во втором пункте может быть проблема. Как именно Вы проверяли каждую соседнюю пару на правильность?
(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 теста.
1) В каком типе данных Вы вычисляете?
2) Проверяйте ли Вы то, что соседние окружности не имеют одну координату X?
В этот раз год ждать не нужно: $$$^{CONTEST}_{SFEDU} 2019$$$ доступен в тренировках!
Открытый чемпионат Юга России - ContestSFedU 2019, финал командного турнира
Планируется ли добавление личного турнира в тренировки?
Личный турнир делают другие авторы. Вопрос им передал. Сейчас можно дорешивать в самих контестах: http://contestsfedu2019sch.contest.codeforces.com http://contestsfedu2019pers.contest.codeforces.com
Если потребуется логин с соревнования, пишите в личку — пришлю.
Есть ли где-нибудь разбор задач личного турнира?
В частности, очень интересны идеи авторских решений на задачи E и G.
Лучше поздно, чем никогда: https://drive.google.com/open?id=0Bxx_YOrRa7QqczVrNHpVRTZ3Vm9jRnV1djFoSlJmdnVCUURV
Есть идеи как решать задачу E из отборочного командного (про количество размещений колец)? В общем случае вроде нашел комбинаторную формулу, но не получилось для крайних случаев решить.
У меня трёхмерная дп N * M * 5.
dp[x][y][i] — кол-во способов разместить i колец при условии, что i-ое кольцо будет иметь координату {x, y}
Почему-то не подумал про дп, спасибо большое, попробую