Всем привет!
Последнее время все больше недовольства у участников раундов по поводу их организации или задач. Встречаются проблемы с условиями, слабыми претестами, неправильным распределением сложностей и т.п.
Я предлагаю здесь обсудить, каким должен быть идеальный раунд с точки зрения как авторов, так и участников.
Сам я участвовал в разработке задач как для кфа, и не только. Поэтому в посте приведу немного своих мыслей, возникающих по ходу подготовки контеста. Само собой, этот список нуждается в дополнении, поэтому я бы очень хотел увидеть ваши идеи в комментариях.
Условие
Прежде всего условие должно ясно объяснить участнику, в чем, собственно, суть задачи. Отсюда появляются следующие соображения:
Условие должно быть коротким
Нужно стараться умещать мысль как можно емко и грамотно. Задача участника — написать правильный код и сдать его, а не читать полторы страницы воды. К этому же пункту можно отнести и легенду. Да, действительно, куда приятней решать задачу про персонажей. Однако история в данном случае — лишь украшение, и не должна преобладать над сутью.Условие должно быть понятным
Все введенные термины и примеры должны быть объяснены в разделе Примечания. Не нужно загромождать определением само условие и разъяснять общеизвестные понятия, но, если у участника появился вопрос насчет толкования какого-то примера или термина, ответ на него он должен найти после семплов.Условие должно быть однозначным
В идеале, уже после первого беглого прочтения задачи, должно быть понятно, что требуется, какие есть нюансы и тонкости. В случае, если какая-то фраза является ключевой, ее нужно выделать изменением шрифта или начертания.Условие должно быть структурированным
Под структурой я имею ввиду четкое разделение на части Собственно условие, Формат входных данных, Формат выходных данных, Примеры, Примечания. На codeforces с этим проблем не бывает. Однако очень часто на локальных олимпиадах я встречал ограничения для переменных прям в самом условии, что дико напрягало.
Ограничения
Правильно подобраные ограничения сильно помогают решить задачу. Поэтому из них должна быть понятна требуемая от участников асимптотика. За эти годы сложились традиционные константы, и я не вижу причин не использовать их без особого повода:
- O(n) — 107
- O(n2) — 5000
- O(n3) — 500
- O(nlogn)- 2·105
- 2n — 23
- mod — 109 + 7
- и т. д.
UPD: Как правильно указали в комментариях, несовсем корректно стандартизировать для всех задач константы размеров входа из-за различия в "весе" операций. Видимо, главный принцип здесь — участники не должны гадать, зайдет ли решение той или иной сложности, требуемая асимптотика должна быть более-менее очевидной.
Претесты и взломы
Пожалуй, по созданию впечатления от всего контеста, стоят на втором месте, после идей задач. Мы с моими знакомыми много раз обсуждали эту тему, и пришли к выводу, что взломы не должны иметь решающее значение в таблице результатов, а должны быть скорее "спасательным кругом" для тех, что получил много штрафа.
При этом, на сложных задачах они должны быть достаточно сильными(согласитесь, не очень приятно, когда полконтеста пишешь геому и получаешь WA в финальном тестировании на каком-то одном неочевидном вырожденном случае), а на слабых достаточно короткими, чтобы не создавать большую очередь в самом начале раунда. В моем понимании, решение, прошедшее претесты должно иметь как минимум правильную асимптотику и корректную работу на крайних значениях.
В целом, получается, что очень трудно подобрать правильный баланс претестов, и легче уж вообще делать их максимально полными(что, впрочем, является самым безопасным выходом).
Сложность задач
Тут все вроде как просто. Во-первых, если в анонсе раунда написано, что задачи расположены по увеличению сложности, то они действительно должны быть расположены по увеличению сложности. Чтобы не ошибиться с распределением, достаточно прогнать раунд на тестовой выборке участников из разных уровней.
В идеале, количество участников, решивших задачу должно быть пропорционально объявленной до начала разбалловке.
Так же не стоит переграбливать контест. В моем понимании, "зеленые" должны спокойно решать A, B из div2, "синие" — A, B, C div2, "фиолетовые" — A, B div1, "желтые" — A, B, C div1, "красные" — A, B, C, D div1. В общем и целом, должна быть примерная корреляция между рейтингом среднестатистического участника и количеством решенных им задач.
Задача С
Задача Сdiv2/Adiv1 — ключевая задача раунда. По ней строится впечатление основной массы участников. Почему? На это есть несколько причин.
Во-первых, эта задача отделяет "слабых" участников от "средних" во втором дивизионе. Если эта задача слишком сложная, увеличивается разрыв между уровнем решивших и не решивших, что не круто.
Во-вторых, она определяет количество участников, пишущих 1 дивизион. Это первая задача, и, если она сложная, то бОльшая часть участников не решит ее в первые полчаса (ну и понятно, что в рейтинговых раундах, если участник ничего не решил в первые 30-40 минут, ему нет смысла что-то посылать вообще). Другими словами, недостаточно сильные участники первого дивизиона не имеют возможности написать раунд и получить плюс вообще.
Таким образом, Cdiv2/Adiv1 — это своеобразное `лицо' контеста и наибольшее внимание при подготовке нужно уделять ей.
Тематика задач
Задачи должны быть на программирование. Да, математика очень тесно связана с программированием, однако не стоит уходить в крайность и давать задачу на вывод формулы. Как антипример, могу привести свою задачу, которую, хоть и можно было решить алгоритмом, многие участники сдавали именно формулой.
Отдельной дискуссии заслуживает геометрия. Уж не знаю почему, но задачи на нее чаще всего встречают очень холодно. Интересно было бы узнать ваше мнение о том, стоит ли давать ее на раундах и почему же ее никто не любит.
Также, нужно понимать, что тема должна соответствовать уровню участников, на которых направлена конкретная задача, и не давать, к примеру, графы в Adiv2 или ретроанализ в Cdiv2/Adiv1.
Разбор
Думаю, не нужно говорить о необходимости хорошего разбора:D
Он должен простыми словами на понятном даже не продвинутым в математике людям языке объяснять решения задач. К каждой задаче должен быть приложен пример кода с комментариями.
Еще, приятно, когда разбор появляется сразу после раунда, а не через несколько дней.
--МЕСТО ДЛЯ ВАШИХ ПРЕДЛОЖЕНИЙ--
Ну, из основого, что сейчас у меня на уме, вроде все.
Еще раз повторяю, что паста выше — это мое субъективное видение. Оно может (и должно!) отличаться от вашего. Я создаю этот пост для того, чтобы в одном месте собрать какие-то соображения для будущих авторов(в том числе и для себя:)).