Воскресное утро, начало одиннадцатого. Пока многие их сверстники спят, сотни юношей и девушек собрались на десяти площадках в Петербурге, Петрозаводске, Мурманске и Новгороде, чтобы принять участие в квалификационном этапе международной олимпиады по программированию ICPC. Одна из крупнейших площадок организована в Университете ИТМО, здесь под турнир выделено десять аудиторий.

До начала соревнований удается пообщаться с несколькими командами. В этом году участники, отбирающиеся на международные соревнования Северо-Запада России, столкнулись с нововведением. Чтобы дать возможность принять участие в чемпионате большему количеству команд и университетов, организаторы ввели дополнительный квалификационный этап, который каждый желающий сможет пройти на одной из площадок в своем городе. Ранее участникам уже на первый этап приходилось приезжать в Петербург из разных городов. Нововведение позволило привлечь около 200 команд (по три человека в каждой) и около десятка новых вузов. Участники отнеслись к появлению нового тура по-разному.

«Мы в первый раз участвуем в ICPC, — рассказывает один из участников турнира Ярослав Заручевский. — Мне кажется, что с появлением квалификационного этапа возможностей стало больше и психологически проще решиться участвовать. Как только мы узнали, что будет квалификационный этап, мы буквально в течение получаса собрали команду».

Квалификационный раунд Северо-Западного Четвертьфинала ICPC
Квалификационный раунд Северо-Западного Четвертьфинала ICPC

Никита Гаевой, представитель СПбГУ и полуфиналист ICPC прошлого года, считает, что новый этап только усложняет структуру отбора.

«Все это не нужно, мне кажется, появился один лишний тур, на который нужно просто прийти», — считает он.

А вот Андрей Кучма, обучающийся на первом курсе Университета ИТМО, напротив, рад участию в квалификации турнира по программированию.

«Мне кажется, что вообще грех не участвовать в ICPC, если учишься в ИТМО, когда одни чемпионы мира вокруг. Можно набраться опыта, это хорошая практика. В следующем году точно буду участвовать еще раз», — рассказал он.

Шанс попробовать для каждого

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

«В квалификации у нас формула отбора достаточно позитивная, — рассказывает после сигнала к началу соревнований один из организаторов, бессменный тренер чемпионов по спортивному программированию  Андрей Станкевич. — Во-первых, от каждого вуза-участника лучшая команда точно будет приглашена на четвертьфинал, даже если займет предпоследнее место, решив при этом хотя бы одну задачу. Далее смотрим на вторые-третьи команды каждого вуза. Сорок лучших из них вне зависимости от места в общем зачете также пройдут в четвертьфинал. Далее идут остальные команды в порядке турнирной таблицы, чтобы в итоге собралось 120 команд».

Квалификационный раунд Северо-Западного Четвертьфинала ICPC
Квалификационный раунд Северо-Западного Четвертьфинала ICPC

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

«Первые две-три задачи более математические, там не надо писать программу больше, чем в четыре-пять строк, — рассказывает Станкевич. — Они доступны тем, у кого были уроки информатики в школе. К примеру, часть С ЕГЭ по информатике заметно сложнее, чем эти несколько первых задач на нашем квалификационном раунде. На начальном этапе речь идет о, скажем, простой знакомой всем задачке: поезд вышел из пункта А в пункт Б, зная его скорость и время, вычислите расстояние, только данные не заданы. Тут и начинается вся суть программирования – нужно написать программу, которая решит задачу с любыми данными, которые введет пользователь. Сейчас компьютерная грамотность нужна всем специальностям — не только программистам, но и физикам, и биологам, и химикам. У нас сейчас достаточно редкая ситуация, что от ИТМО участвует много команд не с программистского нашего факультета. А в одной из топовых команд есть физик».

Пока мы беседуем, заканчивается первый час соревнований. Уже обозначились два уверенных лидера – команда «Havka — ne papstvo» из СПбГУ и «Standard deviation», представляющая Университет ИТМО. Пока многие команды решили лишь по одной задаче, они уже оставили позади девять заданий. Замыкает тройку с восемью решенными заданиями еще одна команда Университета ИТМО

Жесткая гонка

Квалификационный раунд Северо-Западного Четвертьфинала ICPC
Квалификационный раунд Северо-Западного Четвертьфинала ICPC

После начала соревнований участники могут общаться только друг с другом. Телефоны, планшеты, книги и конспекты в любой форме запрещены. Единственное, что можно взять с собой, – еда и питье, ведь выйти перекусить в отведенные пять часов также нельзя. На столах с самого начала стоят соки, энергетики, вода, печенье, шоколадки. Впрочем, отвлекаются на них участники поначалу не так часто. Все полностью погружены в решение задач, кто-то расписывает идеи в блокноте, кто-то пишет код, кто-то думает вслух.

«Когда команда решает задачу математически, идет кодирование на компьютере, — продолжает Станкевич. — Нужно написать программу либо в среде разработки, либо в текстовом редакторе на каком-то языке программирования, который выбрала команда. После этого написанное решение можно протестировать, посмотреть, как оно работает, поскольку условия задачи включают в себя пример входных данных и ожидаемого ответа. После этого можно отправить решение задачи на сервер с помощью браузера. По сложности этот процесс равен прикреплению файла к письму».

Дальше система проверяет программу и либо отмечает задачу как выполненную, либо сообщает участникам об ошибке. Это может быть неверный ответ с другими вводными данными, это может быть чрезмерное время работы алгоритма (чаще всего из-за ошибки в коде), превышение объема требуемой на выполнение задания памяти (также вследствие ошибки) или же вылет программы. Последнее бывает, если на каком-то этапе алгоритма присутствует деление на ноль. В случае если в программе есть ошибка, команда может переделать ее, однако это учитывается в итоговой таблице. Если в конце количество выполненных заданий одинаково, то побеждает та команда, которая затратила меньше попыток. Так, спустя два часа команда «Standard deviation» (из Университета ИТМО) обогнала своих ближайших конкурентов. Обе команды решили по 10 заданий, но представители СПбГУ затратили на седьмую задачу целых пять попыток.

Андрей Станкевич
Андрей Станкевич

Соревнования ICPC – это не только состязание в том, кто лучше программирует. Это турнир, в котором топовые участники подвергаются большим психологическим и даже физическим нагрузкам. Спустя три часа на столах все меньше еды — одни фантики. В аудиториях становится душно, как в спортивном зале. По правилам соревнований на каждую команду приходится только один компьютер, поэтому периодически в некоторых командах люди меняются местами, давая кому-то отдохнуть от решений, а кому-то, в свою очередь, – от написания кода. Исключение составляют те команды, которые пришли на турнир не в полном составе, отправив одного или двух человек. Впрочем, уже в четвертьфинале обязательным будет участие всех трех членов команды.

«Исторически командным этот вид спортивного программирования стал из-за того, что во время первых соревнований не хватило компьютеров на всех участников и пришлось объединить их в команды, — поясняет Андрей Станкевич. — А потом поняли, что командами соревноваться даже интереснее: когда один человек пишет решение, остальные могут продолжать думать и решать другие задачи. Команды очень разные – только от ИТМО участвует три десятка. У каждой есть своя стратегия, разные команды в зависимости от состава участников используют разные тактики. Есть команды, где есть очень хороший математик и очень быстрый программист, тогда первый решает задачи, а программист превращает их в код. Команды ИТМО придерживаются такой тактики, что все три участника достаточно хорошо программируют, сменяют друг друга за компьютером и по очереди пишут».

При этом командам доступна турнирная таблица – они видят, кто сколько решил заданий и сколько потратил попыток. Это помогает понять, где ты находишься относительно конкурентов, а также понять, какие задания решаются остальными командами легче, а какие вызвали сложности у большинства участников. За час до конца турнира таблица «замораживается», участники не могут ее обновить, что усиливает интригу. Так, за час до конца лидирует команда из Университета ИТМО с 11 решенными заданиями, столько же у их конкурентов из СПбГУ. На пятки им наступало еще три команды из Университета ИТМО, пять команд из СПбГУ и две из НИУ ВШЭ, также решившие по десять заданий.

Квалификационный раунд Северо-Западного Четвертьфинала ICPC
Квалификационный раунд Северо-Западного Четвертьфинала ICPC

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

В ожидании четвертьфинала

В итоге, после разморозки результатов видно, что победу с преимуществом только по числу попыток вырывает Standard deviatio, у этих представителей Университета ИТМО получилось в последний час «добить» последнюю задачу, пусть и с четвертой попытки. Сыграло свою роль и то, что целых пять заданий за время турнира они решили быстрее всех. На втором месте оказались представители НИУ ВШЭ, замкнули тройку лидировавшие в начале турнира представители СПбГУ. Всего с 12 заданиями справились первые пять команд.

Квалификационный раунд Северо-Западного Четвертьфинала ICPC
Квалификационный раунд Северо-Западного Четвертьфинала ICPC

В ТОП-25 оказались 10 команд Университета ИТМО. 31 команда вуза попала в первую сотню квалификации.

Почти все команды решили три и более задачи, лишь 18 командам из 196 не покорился этот рубеж. Это, как надеются организаторы, должно показать максимальному числу вузов, даже непрофильным, что квалификация ICPC является для их студентов хорошим стартом, который, возможно, приведет их в будущем в программирование. Этого турнира совершенно не нужно бояться даже пока не очень хорошо подготовленным студентам.

Теперь 120 отобранных команд соберутся 26 октября в Университете ИТМО на четвертьфинальные соревнования. Затем лучшие представители вузов будут отобраны на финальные соревнования Северной Евразии (полуфинал ICPC), которые намечены на декабрь 2019 года. Золотым спонсором этих соревнований станет компания Huawei. Представитель компании Денис Шитов прибыл также и на квалификационный этап, чтобы посмотреть за выступлением ребят и обсудить детали дальнейших соревнований с организаторами.

Денис Шитов
Денис Шитов

«Мы поддерживаем этот турнир, потому что большие надежды возлагаются на молодые таланты, которые в большом количестве есть в комьюнити ICPC. Также для нас важно показать, чем действительно занимается Huawei, насколько широк спектр наших разработок и научных исследований», — пояснил он.

Лучшие из лучших молодых программистов со всего мира соберутся на финал ICPC 2020 в Москве, который будет принимать Московский физико-технический институт.