X5 Tech в этом году выступает генеральным партнёром заключительного этапа ВсОШ по информатике во всех четырёх профилях. Поэтому мы с коллегами невольно вспомнили, как сами участвовали в олимпиадах по информатике и задумались, в чём их сходство и различия, а главное, как изменились сами участники. Школьные олимпиады по информатике до сих пор воспринимаются как отдельный мир, где дети решают абстрактные задачи, далёкие от реальной работы. Но сильный олимпиадник сегодня уже не просто быстро пишет код. По уровню алгоритмического мышления он близок к junior, а иногда и к middle-разработчику, только без боевого опыта. Он умеет жить в таймлимитах, думать об асимптотике, быстро проектировать решение, дебажить под давлением и работать не только с чистой алгоритмикой, но и с задачами по ИИ, безопасности и робототехнике. Поэтому заключительный этап Всероссийской олимпиады школьников по информатике, который в этом году проходит с 22 по 28 марта, показывает, какой инженер будет нужен индустрии через несколько лет. Чтобы понять, из каких скилов собирается портрет будущего инженера, мы посмотрели, как сегодня устроен финал олимпиады, какие задачи там дают и чему он на самом деле учит.
Олимпиада масштабируется
Число участников финала Всероссийской олимпиады школьников по информатике выросло с ~500 в прошлом году до ~1250 в текущем. Но масштаб виден не только в цифрах, а и в самой конструкции олимпиады. Это уже не классическая информатика про алгоритмы, а четыре отдельных профиля: программирование, информационная безопасность, робототехника и искусственный интеллект. У них разные типы задач и свои требования к участникам.
Вход в олимпиадную среду тоже изменился. Раньше всё часто начиналось почти случайно. По крайней мере, у меня было именно так. Учитель просто отправлял сильных учеников на олимпиаду, причём иногда сообщал об этом за несколько дней до её проведения. Сейчас это больше осознанная мотивация через интерес к задачам и поступление в вуз.
Если раньше в олимпиады чаще приходили в 9–10 классе, то сейчас готовятся уже с 7–8, потому что путь до сильного результата занимает около двух лет. И подготовка быстро становится регулярной практикой по несколько часов в день. У кого-то это занятия с учителем, у кого-то кружки, репетиторы или онлайн-платформы. Сверху добавляются смены в лагерях по подготовке к олимпиадам и образовательные интенсивы.
Обычно такая подготовка держится на трёх вещах: решении задач прошлых лет, глубокой теории, куда входят алгоритмы, структуры данных и комбинаторика, и постоянной практике в олимпиадных форматах, включая тренировочные контесты.
Сейчас олимпиады по формату всё больше напоминают хакатоны, но с более длинной дистанцией и жёсткими ограничениями. Есть задача и лимит времени, нужно быстро найти решение и реализовать его без ошибок. Но нет команды, доступа к интернету и возможности компенсировать слабые места за счёт других участников. Практически «голодные игры». Всё держится на подготовке и умении быстро думать.
Не одна олимпиада, а четыре
В программировании всё жёстко, но честно. Есть ограничение по времени, памяти и цена ошибки. Уже мало придумать правильную идею. Её нужно довести до состояния, в котором она переживёт все тесты. Ведь один неучтённый крайний случай может перечеркнуть часы работы.
В искусственном интеллекте логика другая. Задача редко сводится к одному эталонному решению. Нужно работать с данными, проверять гипотезы, выбирать подход и улучшать результат. Это уже не спортивное программирование, а исследование под давлением времени.
Информационная безопасность про «разберись, что здесь вообще происходит». Нужно читать систему, искать слабое место, восстанавливать логику чужих действий. Это уже вообще не про алгоритмику, а про внимание, критическое мышление и умение видеть конструкцию целиком, включая «трещины».
Но сильнее всего разница видна в робототехнике. Код перестаёт жить только на экране и выходит в физический мир. Сразу появляются датчики, моторы, сигналы, погрешности, механика. И реальность говорит, что правильный алгоритм ещё не гарантирует хороший результат.
У каждого профиля свой регламент. В программировании, информационной безопасности и искусственном интеллекте заключительный этап обычно состоит из двух туров примерно по 5 астрономических часов каждый. В робототехнике регламент длиннее. Там три тура. Теоретический длится 180 минут. Практический разбит на два этапа: подготовительный на 180 минут и основной на 240 минут. Проектный тур тоже состоит из двух частей: технический допуск на 120 минут и основной этап на 240 минут.
Похоже на те олимпиады в которых вы участвовали? (если участвовали)
А когда так расходятся способы мышления, расходятся и инструменты. У каждого свой язык, стек и минимальный порог входа.
На чём пишут и что знают
Именно здесь базовый набор навыков начинает играть почти магическую роль. Как в сказках, где у путеводного камня мало просто выбрать направление. Нужно понимать, что поможет получить там свои «полцарства».
В классическом программировании всё по-прежнему держится на C++. Это даёт больше шансов уложиться в ограничения и получить полное решение. Формально писать можно и на Python 3, и на Java, и на PascalABC.Net, но на длинной дистанции это вопрос выживания под гнётом времени и памяти.
При этом почти у всех в базе есть Python. Это не второй выбор на всякий случай, а полноценный рабочий инструмент. Связка C++ и Python — новая норма. Один язык нужен, чтобы понимать вычислительный процесс, стоимость операций и писать быстрые решения. А второй, чтобы быстро собирать прикладные вещи, работать с данными и не тратить силы на синтаксис.
В целом не так уж важно, на каком языке человек начинал готовиться, если у него есть база и понимание того, как решается задача. Тот же Геннадий Короткевич программировал на Pascal, который сегодня уже воспринимается как язык из прошлого. А во многих школах сейчас начальное обучение ведётся на Python, потому что он проще, короче и позволяет быстрее сосредоточиться на самой задаче, а не на синтаксисе.
Поэтому олимпиадная база начинается не с языков, а с магических штучек: графы, динамическое программирование, строки, структуры данных, теория чисел, геометрия. Плюс умение не просто помнить готовую реализацию, а собрать её заново, если задача требует другого подхода. Участник уже должен не заучивать решения, а понимать, как перестроить их под новый контекст.
В искусственном интеллекте центр тяжести смещается. Мало писать код. Нужно знать статистику и теорию вероятности, понимать, как устроен анализ данных и обучение моделей. К Python добавляются NumPy, Pandas, Matplotlib, а дальше уже PyTorch или TensorFlow. И это, наверное, один из самых заметных сдвигов во всей олимпиаде. От задачи «найди правильный алгоритм» участник переходит к задаче «собери рабочий пайплайн и добейся хорошего результата».
В информационной безопасности набор другой. Здесь нужно понимать, как устроены сети, операционные системы, базы данных и шифрование. Уметь работать в Unix-подобной среде, писать скрипты на bash, разбираться в Python и не бояться чужого кода. Нужно уметь разбирать систему не только как инженер, но и как атакующий.
В робототехнике рядом с кодом контроллеры, сенсоры, камеры, исполнительные механизмы, схемы и сигналы. Для LEGO обычно используют Scratch или Python, для Arduino чаще нужен C++. Но главное здесь даже не язык, а то, что код живёт внутри устройства. А значит, участнику приходится думать не только как программисту, но и понимать механику, электронику и поведение железа в реальном мире.
Не хочется впадать в «как всё быстро меняется» и «у нас такого не было», но, когда я учился на «ремонт и эксплуатации ЭВМ», то получил доступ к железу и чему-то более интересному, чем заставлять подпрыгивать шарик в QBasic, только на третьем курсе. Теперь всё в разы ускорилось. Вход в инженерную среду начинается гораздо раньше, а инструментов с самого начала намного больше. Поэтому приходится быстро взрослеть и собирать разные инженерные наборы под конкретную задачу.
Какие задачи решают
Конечно, школьники на олимпиаде всё ещё сидят за компьютерами и пишут код, но суть в том, какой это код и что стоит за ним. Задачи финала обычно вырастают из знакомых тем, но поверх них почти всегда появляется ещё один слой: жёсткие ограничения, нестандартный поворот или необходимость собрать решение из нескольких подходов сразу.
Поэтому современная олимпиадная задача обычно проверяет сразу несколько вещей:
-
насколько хорошо участник знает базовые алгоритмы и структуры данных
-
умеет ли он выбрать правильную асимптотику под конкретные ограничения
-
может ли быстро реализовать решение без ошибок
-
видит ли краевые случаи и умеет ли отлаживать код
-
знает ли несколько способов решить одну и ту же задачу
В базе у участника должен быть довольно плотный набор тем. Это сортировки и бинарный поиск, стеки, очереди, деки, кучи, хеш-таблицы, обходы графов, кратчайшие пути, остовные деревья, динамическое программирование, теория чисел, строковые алгоритмы, дерево отрезков, дерево Фенвика, DSU и геометрия. Иначе подобные задачи просто не решить.
Условие
Андрей готовится к собеседованию на стажировку по машинному обучению. Чтобы разобраться с базовыми идеями классификации, он начал с самого простого случая: если точки двух классов на плоскости можно разделить прямой, то метод опорных векторов (SVM) строит разделяющую прямую
w1x + w2y + b = 0,
и знак выражения w1x + w2y + b определяет, к какому классу относится точка (с одной стороны от прямой все точки будут иметь знак +, а с другой −).
Так Андрей познакомился с линейной классификацией.
Он нашёл простой пример кода, который показывает, как можно считать точки из стандартного ввода, записать их в таблицу с колонками ‘x‘, ‘y‘, ‘label‘ и обучить по этим данным линейный SVM:
import sys
import pandas as pd
from sklearn.svm import SVC
def read_points():
data = []
tokens = sys.stdin.read().split()
it = iter(tokens)
n = int(next(it))
for _ in range(n):
x = float(next(it))
y = float(next(it))
label = int(next(it))
data.append((x, y, label))
df = pd.DataFrame(data, columns=["x", "y", "label"])
return df
df = read_points()
clf = SVC(kernel="linear")
clf.fit(df[["x", "y"]], df["label"])
w1, w2 = clf.coef_[0]
b = clf.intercept_[0]
print(w1, w2, b)
Однако на собеседовании Андрею досталась другая задача.
Даны точки на плоскости с метками классов −1 и +1. Гарантируется, что существует окружность с центром (x0, y0) и радиусом R > 0 такая, что
-
все точки класса −1 лежат строго внутри этой окружности;
-
все точки класса +1 лежат строго вне этой окружности.
Нужно найти любую такую окружность (x0, y0, R).
Помогите Андрею решить эту задачу и пройти собеседование!
Формат ввода
Первая строка: целое число n (3 ≤ n ≤ 105 ). Далее n строк: по три вещественных числа xi , yi , labeli — координаты очередной точки и ее метка.
Гарантируется, что |xi |, |yi | ≤ 109 .
Формат вывода
Выведите три вещественных числа x, y и R — координаты и радиус разделяющей окружности.
Этот пример хорошо показывает, как изменилась олимпиада. Мало того, что он маскируется под задачу про машинное обучение. Из-за него начинаешь автоматически искать решение связанное с библиотекой, моделью и обучением. На входе вроде бы прикладная AI-задача, а на выходе оказывается задача на геометрию, преобразование пространства и математику. Её бессмысленно пытаться решить в лоб. При n ≤ 10^5 и координатах до 10^9 это уже не «подбери окружность руками». Здесь проверяется не знание какого-то конкретного инструмента, а умение докопаться до внутренней структуры задачи и собрать решение под реальные ограничения.
Разница подходов
Сильный участник олимпиады раскладывает задачу на ограничения, прикидывает допустимую сложность, ищет узкие места и только потом выбирает подход.
Рабочая схема выглядит так:
-
понять условие,
-
выбрать метод,
-
быстро собрать решение
-
прогнать через все тесты.
Это хорошо видно на задаче про разделяющую окружность, которую я приводил выше. Условие специально подталкивает к ложному ходу. Сначала читателю показывают линейный SVM и вполне прикладной код:
clf = SVC(kernel="linear")
clf.fit(df[["x", "y"]], df["label"])
Опытный разработчик легко цепляется за эту часть и начинает думать про sklearn, обучение модели и подбор параметров. Олимпиадник смотрит не на знакомые слова, а на постановку и ограничения. Если дано n ≤ 10^5, координаты по модулю до 10^9 и нужно найти любую подходящую окружность, нужно искать, к какой математической модели всё это можно свести.
Поэтому взрослые разработчики часто ошибаются на олимпиадных задачах. Они пытаются решать их слишком прямо. А на олимпиадах таких задач почти не бывает. Почти всегда в условии есть деталь, на которую сначала не обращаешь внимания, а потом именно она ломает весь на первый взгляд правильный подход.
Ещё одна важная черта сильных участников в том, что они не застревают на одном варианте, а умеют быстро перебирать подходы и переключаться, если первый не работает. Участники часто проигрывают не потому, что не знают тему, а потому, что слишком долго держатся за одну идею.
Знание алгоритмов здесь недостаточно. Большая часть успеха зависит от опыта и психологической устойчивости. Её тоже можно выработать. Те, кто рано входят в олимпиадную среду и много тренируются, быстрее привыкают к стрессовым условиям и на туре не тратят силы на панику. Тот кто знает всё, но паникует — решает сильно меньше того, кто не нервничает.
Сюда же относится и внутренняя мотивация. Важна цель, с которой участник приходит на олимпиаду, и внутренний стержень, который не даёт опустить руки на туре. В итоге сильный результат складывается не из одного фактора, а сразу из нескольких: база, опыт, хладнокровие и умение не развалиться в тот момент, когда задача не поддаётся.
Что пригодится
Не всё, что даёт олимпиада, можно забрать с собой на работу, но несколько вещей остаются надолго:
-
Привычка искать неочевидные ходы и пути решения, когда обычные способы не дали результата.
-
Сама манера думать, способность смотреть на задачу с разных сторон.
-
Отдельно остаётся алгоритмическая база. Не потому, что в работе каждый день приходится писать дерево Фенвика, а потому, что знание алгоритмов в большинстве случаев помогает писать оптимизированные программы.
Есть и ещё один эффект, который сложнее измерить, но он хорошо чувствуется на практике. Олимпиада развивает аналитическое мышление и позволяет за короткий срок заштормить определённую задачу, разложить её на части и начать двигаться к решению.
При этом часть олимпиадного опыта в реальной разработке быстро теряет смысл. Например, навык решать задачи в условиях стресса без еды и интернета. В работе перерыв на обед наоборот может стать бустом к решению проблемы. Ещё и с коллегами можно посовещаться.
Но, пожалуй, самое сложное для олимпиадника — научиться вовремя останавливаться и переставать бесконечно улучшать и без того правильное решение. В реальности система должна работать, и никого не волнует, будут ли её части красивыми и правильными.
Поэтому адаптация после олимпиад обычно не выглядит драматичной, но приходится привыкать к читаемому коду и командной работе. Олимпиадников можно встретить почти везде: от бигтеха до финтеха, ритейла и промышленности.
Каким будет сильный инженер
Прогнозы — дело неблагодарное, особенно при таком непредсказуемом развитии ИИ, но по тому, как трансформируются такие консервативные вещи, как олимпиады, можно сделать вывод.
Инженер будущего — уже не просто человек, который много знает и быстро пишет код. Его главная сила в адаптивности. Мир, в котором новые инструменты, модели и подходы появляются почти каждый день, плохо подходит тем, кто привык один раз выучить стек и держаться только за него. Выигрывать будет тот, кто умеет быстро перестраиваться, доучиваться на ходу и не теряться, когда правила снова меняются. В каком-то смысле олимпиады как раз этому и учат.
Но одного умения пользоваться генеративными моделями тоже недостаточно. Чем больше вокруг автоматизации, тем выше цена нормального инженерного мышления. Нужны опыт, насмотренность и понимание того, как устроена система целиком. Сгенерировать фрагмент кода сегодня уже несложно. Намного ценнее понять, куда его встраивать, как он поведёт себя в реальной среде и что случится с системой после очередного «небольшого улучшения». Получается, что нужно учиться быстрее среды, и принимать решения в условиях, когда готового правильного ответа ещё нет.
Но давайте не будем ограничиваться общими словами, а проверим свой уровень адаптации на реальной задаче, с похожими работают участники олимпиады. Пишите в комментариях, что у вас получилось.
Челлендж: попробуйте решить олимпиадную задачу сами
Острова рекомендаций
Баллов за задачу: 100, по 20 за каждый вопрос
Формат сдачи ответа: ввод или загрузка файла, в зависимости от вопроса
Количество попыток: 10 на каждую подзадачу
Посылка в зачет: последняя
Условие
Вы работаете аналитиком в команде онлайн-маркетплейса. На сайте у каждого товара есть карточка с информацией (категория, цена, рейтинг, бренд, наличие) и блок «С этим также смотрят», где показаны другие товары, на которые пользователи часто переходят из данной карточки.
Вам выдали выгрузку двух таблиц в формате CSV:
-
items.csv — список товаров и их свойства.
-
also_viewed.csv — список переходов «с этим также смотрят».
Нужно ответить на несколько вопросов про товары и структуру рекомендательного графа. Ответы нужно получать с помощью программной обработки данных (например, на Python с использованием pandas и простых алгоритмов работы с графами).
Файл items.csv содержит информацию о товарах. Каждая строка — один товар.
Поля:
-
item_id — уникальный целочисленный идентификатор товара.
-
category — категория товара (phones, accessories, laptops, books, home, toys).
-
price — цена товара в условных единицах (целое число).
-
rating — рейтинг товара по данным отзывов (вещественное число от 3.0 до 5.0 с шагом 0.1).
-
brand — название бренда (строка).
-
in_stock — 1, если товар есть в наличии, 0, если нет.
Файл also_viewed.csv описывает связи между товарами в блоке «с этим также смотрят». Каждая строка задаёт пару товаров (item_from, item_to), для которых зафиксировано, что пользователи часто переходят с одного на другой. В задачах, где речь идёт о «соседях» товара или о переходах между товарами, будем считать, что такая связь работает в обе стороны: если в таблице есть строка с парой товаров A и B (в любом порядке), то A и B считаются напрямую связанными рекомендациями.
Для товара X его «соседями» считаются все товары, которые хотя бы в одной строке стоят в паре с X — неважно, указан X в item_from или в item_to.
Система оценивания
За эту задачу можно получить до 100 баллов. Каждый пункт стоит 20 баллов.
Результаты тестирования подзадач 1, 2, 3 и 5 недоступны во время проведения тура. Во всех подзадачах засчитывается последняя посылка.
A1 — Вопрос 1
Сколько всего товаров категории phones имеют рейтинг не ниже 4.5 (rating ≥ 4.5) и при этом есть в наличии (in_stock = 1)?
Формат вывода
Одно целое число — количество таких товаров.
Метрика оценивания точности ответа
Строгое совпадение введенного ответа.
A2 — Вопрос 2
Рассмотрим только товары категории laptops. Для каждого бренда посчитайте среднюю цену ноутбуков этого бренда. Какой бренд имеет максимальную среднюю цену среди ноутбуков?
Если несколько брендов имеют одинаковую максимальную среднюю цену, можно вывести любой из них.
Формат вывода
Одно слово — название бренда (строка brand из файла items.csv).
Метрика оценивания точности ответа
Строгое совпадение введенного ответа.
A3 — Вопрос 3
Команда маркетинга хочет разделить товары на три сегмента по цене и рейтингу:
-
сегмент premium — если rating ≥ 4.5 и price ≥ 50000;
-
сегмент standard — если rating ≥ 4.0 и price < 50000;
-
сегмент budget — во всех остальных случаях.
Для каждого товара определите его сегмент (premium / standard / budget) по этим правилам. Среди товаров, которые есть в наличии (in_stock = 1), посчитайте, сколько товаров относится к сегменту premium.
Формат вывода
Одно целое число — количество товаров сегмента premium среди товаров с in_stock = 1.
Метрика оценивания точности ответа
Строгое совпадение введенного ответа.
A4 — Вопрос 4
Рассмотрим файл also_viewed.csv. Найдите все товары, которые хотя бы один раз встречаются в поле item_to (то есть товары, которые хотя бы раз были показаны в блоке «С этим также смотрят»). Для каждой категории посчитайте, сколько разных товаров из этой категории встречается в item_to хотя бы один раз.
Нужно подготовить таблицу с двумя столбцами:
-
category — название категории;
-
cnt — количество разных товаров этой категории, которые встречаются в item_to.
В таблицу следует включить все категории, которые есть в файле items.csv, даже если для какой-то категории cnt = 0. Строки в таблице нужно отсортировать по названию категории в алфавитном порядке.
Формат вывода
Текстовый файл answer4.csv в формате CSV с заголовком и двумя колонками:
category,cnt
Файл должен содержать ровно по одной строке для каждой категории.
Метрика оценивания точности ответа
Доля категорий category в вашем файле-ответе, для которых количество cnt совпадает с количеством cnt в эталонном файле-ответе.
A5 — Вопрос 5
Будем рассматривать связи между товарами, как описано в разделе «Описание датасета»: два товара считаются напрямую связанными, если в also_viewed.csv есть строка, где они стоят парой (в любом порядке).
Назовём «островом рекомендаций» любое множество товаров, внутри которого из любой карточки можно добраться до любой другой карточки, переходя по прямым связям между товарами (по соседям). Если два товара относятся к разным островам рекомендаций, то никакой цепочкой таких переходов из одного к другому попасть нельзя.
Нас интересуют такие острова рекомендаций, в которых одновременно есть хотя бы один товар категории phones и хотя бы один товар категории accessories.
Сколько таких островов рекомендаций существует в наших данных?
Формат вывода
Одно целое число — количество «островов рекомендаций», в которых есть и хотя бы один phones, и хотя бы один accessories.
Метрика оценивания точности ответа
Строгое совпадение введенного ответа.
Автор: PavelRodikov


