HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>15 апр 2024</li>
2 <ul><li>15 апр 2024</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><h2>О код, ты - мир: что такое спортивное программирование и при чём тут спорт</h2>
4 </ul><h2>О код, ты - мир: что такое спортивное программирование и при чём тут спорт</h2>
5 <p>А также даёт ли выбор языка программирования преимущество при решении задач.</p>
5 <p>А также даёт ли выбор языка программирования преимущество при решении задач.</p>
6 <p>Фото: Leon Neal / Getty Images</p>
6 <p>Фото: Leon Neal / Getty Images</p>
7 <p>Пишет об истории IT, разработке и советской кибернетике. Знает Python, JavaScript и немного C++, но предпочитает писать на русском.</p>
7 <p>Пишет об истории IT, разработке и советской кибернетике. Знает Python, JavaScript и немного C++, но предпочитает писать на русском.</p>
8 <p>В одном из выпусков подкаста "Люди и код" мы поговорили с Ильёй Кучумовым, который на протяжении семи лет участвовал в различных соревнованиях по спортивному программированию и побеждал в них. Илья рассказал, что это за спорт такой, и поделился собственными наблюдениями о подготовке, тактике и психологии соревнований.</p>
8 <p>В одном из выпусков подкаста "Люди и код" мы поговорили с Ильёй Кучумовым, который на протяжении семи лет участвовал в различных соревнованиях по спортивному программированию и побеждал в них. Илья рассказал, что это за спорт такой, и поделился собственными наблюдениями о подготовке, тактике и психологии соревнований.</p>
9 <p>Эта статья - конспект беседы от первого лица. Послушать<a>аудиоверсию</a>можно на одной из популярных подкаст-площадок.</p>
9 <p>Эта статья - конспект беседы от первого лица. Послушать<a>аудиоверсию</a>можно на одной из популярных подкаст-площадок.</p>
10 <p>Руководитель отдела разработки поиска по товарам в "Яндексе". Во время обучения в университете стажировался в одном из европейских офисов Google.</p>
10 <p>Руководитель отдела разработки поиска по товарам в "Яндексе". Во время обучения в университете стажировался в одном из европейских офисов Google.</p>
11 <p>В 2018 году занял второе место в финале Google Hash Code, а в 2017-м - 14-е место в финале<a>ICPC</a>. Является автором двух задач для финального раунда<a>Yandex Cup 2022</a>в дисциплине "Алгоритм".</p>
11 <p>В 2018 году занял второе место в финале Google Hash Code, а в 2017-м - 14-е место в финале<a>ICPC</a>. Является автором двух задач для финального раунда<a>Yandex Cup 2022</a>в дисциплине "Алгоритм".</p>
12 <p>Суть спортивного программирования заключается в том, что участникам нужно за ограниченное время решить несколько сложных алгоритмических задач. В описании каждой задачи определён формат входных и выходных данных, а также приведены примеры и соответствующие им результаты. Участникам предоставляют компьютеры: один на команду или по одному на каждого участника - в зависимости от условий.</p>
12 <p>Суть спортивного программирования заключается в том, что участникам нужно за ограниченное время решить несколько сложных алгоритмических задач. В описании каждой задачи определён формат входных и выходных данных, а также приведены примеры и соответствующие им результаты. Участникам предоставляют компьютеры: один на команду или по одному на каждого участника - в зависимости от условий.</p>
13 <p>При этом недостаточно написать код, который будет выдавать верный результат. Программа должна быть достаточно быстрой, то есть находить<strong></strong>решения с разными входными данными за отведённое в условии время (например, за 1 секунду) и не потреблять объём памяти выше заданного значения (например, 256 МБ).</p>
13 <p>При этом недостаточно написать код, который будет выдавать верный результат. Программа должна быть достаточно быстрой, то есть находить<strong></strong>решения с разными входными данными за отведённое в условии время (например, за 1 секунду) и не потреблять объём памяти выше заданного значения (например, 256 МБ).</p>
14 <p>Как правило, очевидные решения, которые приводят к правильному результату, оказываются слишком медленными или "тяжёлыми", поэтому приходится разрабатывать более эффективные алгоритмы.</p>
14 <p>Как правило, очевидные решения, которые приводят к правильному результату, оказываются слишком медленными или "тяжёлыми", поэтому приходится разрабатывать более эффективные алгоритмы.</p>
15 <p>Типичная задача для соревнований, взятая из архива<a>codeforces.com</a>.</p>
15 <p>Типичная задача для соревнований, взятая из архива<a>codeforces.com</a>.</p>
16 <p><strong>Ограничение по времени на тест:</strong>3 секунды</p>
16 <p><strong>Ограничение по времени на тест:</strong>3 секунды</p>
17 <p><strong>Ограничение по памяти на тест:</strong>256 мегабайт</p>
17 <p><strong>Ограничение по памяти на тест:</strong>256 мегабайт</p>
18 <p><strong>Ввод</strong>: стандартный ввод</p>
18 <p><strong>Ввод</strong>: стандартный ввод</p>
19 <p><strong>Вывод</strong>: стандартный вывод</p>
19 <p><strong>Вывод</strong>: стандартный вывод</p>
20 <p>На двухмерной декартовой плоскости расположено<em>n</em>городов. Расстояние между двумя городами равняется Манхэттенскому расстоянию между ними (определение см. в примечаниях). Гамильтоновым циклом указанных городов является перестановка из <em>n</em>городов. Длина этого Гамильтонова цикла определяется как сумма расстояний между смежными городами в перестановке плюс расстояние между первым и последним городом в перестановке. Пожалуйста, подсчитайте длиннейшую возможную длину Гамильтонова цикла данных городов.</p>
20 <p>На двухмерной декартовой плоскости расположено<em>n</em>городов. Расстояние между двумя городами равняется Манхэттенскому расстоянию между ними (определение см. в примечаниях). Гамильтоновым циклом указанных городов является перестановка из <em>n</em>городов. Длина этого Гамильтонова цикла определяется как сумма расстояний между смежными городами в перестановке плюс расстояние между первым и последним городом в перестановке. Пожалуйста, подсчитайте длиннейшую возможную длину Гамильтонова цикла данных городов.</p>
21 <p><strong>Входные данные</strong></p>
21 <p><strong>Входные данные</strong></p>
22 <p>В первой строке записано целое число<em>n</em>(3 ≤<em>n</em>≤ 105). Затем следует<em>n</em>строк, в каждой записано по два целых числа<em>x</em><em>i</em>и <em>y</em><em>i</em>(0 ≤<em>x</em><em>i</em>,<em>y</em><em>i</em>≤ 109), обозначающих координаты города. Все данные точки различны.</p>
22 <p>В первой строке записано целое число<em>n</em>(3 ≤<em>n</em>≤ 105). Затем следует<em>n</em>строк, в каждой записано по два целых числа<em>x</em><em>i</em>и <em>y</em><em>i</em>(0 ≤<em>x</em><em>i</em>,<em>y</em><em>i</em>≤ 109), обозначающих координаты города. Все данные точки различны.</p>
23 <p><strong>Выходные данные</strong></p>
23 <p><strong>Выходные данные</strong></p>
24 <p>Выведите единственную строку, обозначающую наибольшую возможную длину Гамильтонова цикла данных городов. Сам цикл выводить не надо, только его длину.</p>
24 <p>Выведите единственную строку, обозначающую наибольшую возможную длину Гамильтонова цикла данных городов. Сам цикл выводить не надо, только его длину.</p>
25 <p>Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.</p>
25 <p>Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-битных чисел на С++. Рекомендуется использовать потоки cin, cout или спецификатор %I64d.</p>
26 <p><strong>Примеры</strong></p>
26 <p><strong>Примеры</strong></p>
27 <strong>Входные данные</strong>41 11 22 12 2<strong>Выходные данные</strong>6<p><strong>Командные.</strong>Обычно проводятся среди студентов. Группы по три человека в течение пяти часов решают алгоритмические задачи, которые предполагают наличие точного решения. На команду выдаётся по одному компьютеру. Количество задач - от 8 до 12. Кто решил больше, тот и выигрывает.</p>
27 <strong>Входные данные</strong>41 11 22 12 2<strong>Выходные данные</strong>6<p><strong>Командные.</strong>Обычно проводятся среди студентов. Группы по три человека в течение пяти часов решают алгоритмические задачи, которые предполагают наличие точного решения. На команду выдаётся по одному компьютеру. Количество задач - от 8 до 12. Кто решил больше, тот и выигрывает.</p>
28 <p>Самый популярный чемпионат этого формата -<a>ICPC</a>(International Collegiate Competitive Contest). Соревнование состоит из четырёх, иногда из пяти этапов. Финал проводится в разных странах, среди которых США, Португалия, Индонезия, Бангладеш и другие. Ежегодно в ICPC участвует около 1300 студентов.</p>
28 <p>Самый популярный чемпионат этого формата -<a>ICPC</a>(International Collegiate Competitive Contest). Соревнование состоит из четырёх, иногда из пяти этапов. Финал проводится в разных странах, среди которых США, Португалия, Индонезия, Бангладеш и другие. Ежегодно в ICPC участвует около 1300 студентов.</p>
29 <p><strong>Индивидуальные.</strong>Это довольно суровые баталии, как правило, без ограничений по возрасту, поэтому на них можно встретить ветеранов с 15-20-летним стажем. Победить или хотя бы пройти в финал невероятно сложно.</p>
29 <p><strong>Индивидуальные.</strong>Это довольно суровые баталии, как правило, без ограничений по возрасту, поэтому на них можно встретить ветеранов с 15-20-летним стажем. Победить или хотя бы пройти в финал невероятно сложно.</p>
30 <p>Самые известные и престижные индивидуальные состязания -<a>Topcoder Open</a>,<a>AtCoder</a>и Google Code Jam (прекращено в 2023 году). Есть и локальные российские события вроде<a>Yandex Cup</a>.</p>
30 <p>Самые известные и престижные индивидуальные состязания -<a>Topcoder Open</a>,<a>AtCoder</a>и Google Code Jam (прекращено в 2023 году). Есть и локальные российские события вроде<a>Yandex Cup</a>.</p>
31 <p><strong>Оптимизационные.</strong>В последнее время популярность набирает формат задач, не предполагающих наличия строгого решения. В таких соревнованиях побеждает тот, кто нашёл оптимальный алгоритм. При этом почти всегда решение можно "докрутить", чтобы сделать его ещё более эффективным.</p>
31 <p><strong>Оптимизационные.</strong>В последнее время популярность набирает формат задач, не предполагающих наличия строгого решения. В таких соревнованиях побеждает тот, кто нашёл оптимальный алгоритм. При этом почти всегда решение можно "докрутить", чтобы сделать его ещё более эффективным.</p>
32 <p>Оптимизационные задачи решают на Topcoder Open Marathon и Google Hash Code.</p>
32 <p>Оптимизационные задачи решают на Topcoder Open Marathon и Google Hash Code.</p>
33 <p>В 2018 году мы с командой участвовали в Google Hash Code. В финале была задача по проектированию города. Нужно было расставить жилые дома, детские сады и больницы так, чтобы жителям было достаточно комфортно там жить: чтобы дорога до больницы не занимала много времени, детские площадки были не слишком далеко от домов и так далее. Выиграл тот, кто разместил на карте больше всего жителей. У этой задачи не существует математически оптимального решения - любое решение можно понемногу оптимизировать.</p>
33 <p>В 2018 году мы с командой участвовали в Google Hash Code. В финале была задача по проектированию города. Нужно было расставить жилые дома, детские сады и больницы так, чтобы жителям было достаточно комфортно там жить: чтобы дорога до больницы не занимала много времени, детские площадки были не слишком далеко от домов и так далее. Выиграл тот, кто разместил на карте больше всего жителей. У этой задачи не существует математически оптимального решения - любое решение можно понемногу оптимизировать.</p>
34 <p>Также появляются новые форматы, связанные с машинным обучением, но они не относятся к классическому спортивному программированию.</p>
34 <p>Также появляются новые форматы, связанные с машинным обучением, но они не относятся к классическому спортивному программированию.</p>
35 <p>Слово "спорт" в нашем деле появилось не случайно, ибо здесь, как и в баскетболе, хоккее и других командных играх, важны подготовка и тактика. Нужно эффективно использовать время и сильные стороны членов команды, а также достичь высокой степени сыгранности. В связи с этим возникают разные требования к командному составу: нельзя просто взять и набрать трёх сильных программистов - у каждого должна быть специализация.</p>
35 <p>Слово "спорт" в нашем деле появилось не случайно, ибо здесь, как и в баскетболе, хоккее и других командных играх, важны подготовка и тактика. Нужно эффективно использовать время и сильные стороны членов команды, а также достичь высокой степени сыгранности. В связи с этим возникают разные требования к командному составу: нельзя просто взять и набрать трёх сильных программистов - у каждого должна быть специализация.</p>
36 <p>Например, один участник, отлично знающий язык программирования, может отвечать за программную реализацию алгоритма. Другой - быть спецом в узкой теме вроде линейной алгебры или вычислительной геометрии, а третий - выполнять роль этакого универсального солдата, способного выстроить "мостик" между тиммейтами.</p>
36 <p>Например, один участник, отлично знающий язык программирования, может отвечать за программную реализацию алгоритма. Другой - быть спецом в узкой теме вроде линейной алгебры или вычислительной геометрии, а третий - выполнять роль этакого универсального солдата, способного выстроить "мостик" между тиммейтами.</p>
37 <p>В условиях ограниченного времени важно определить, какие задачи брать в работу в первую очередь, какие - во вторую, а какие вовсе лучше выбросить. Поэтому в любой хорошей команде должен быть лидер, за которым остаётся последнее слово в таких вопросах. Хотя, конечно, почти всегда это решается сообща.</p>
37 <p>В условиях ограниченного времени важно определить, какие задачи брать в работу в первую очередь, какие - во вторую, а какие вовсе лучше выбросить. Поэтому в любой хорошей команде должен быть лидер, за которым остаётся последнее слово в таких вопросах. Хотя, конечно, почти всегда это решается сообща.</p>
38 <p>Если говорить о тактике в спортивном программировании, то по большому счёту она связана с тем, как обсуждать задачи, кому и в каком порядке их решать, когда бросать и когда возвращаться.</p>
38 <p>Если говорить о тактике в спортивном программировании, то по большому счёту она связана с тем, как обсуждать задачи, кому и в каком порядке их решать, когда бросать и когда возвращаться.</p>
39 <p>Часто на соревнованиях выдаётся один компьютер на команду, поэтому если кто-то отлаживает программу, то другую в этот момент писать нельзя. Так что тестирование - один из важнейших элементов тактики.</p>
39 <p>Часто на соревнованиях выдаётся один компьютер на команду, поэтому если кто-то отлаживает программу, то другую в этот момент писать нельзя. Так что тестирование - один из важнейших элементов тактики.</p>
40 <p>У нас были свои хаки в тестировании. Например, мы могли быстро запустить программу на тест-кейсах, распечатать на принтере промежуточные значения и по листочкам разбираться, что пошло не так. Или быстро написать генератор тестов, запустить перебор и найти случайный тест, на котором решение не сработает.</p>
40 <p>У нас были свои хаки в тестировании. Например, мы могли быстро запустить программу на тест-кейсах, распечатать на принтере промежуточные значения и по листочкам разбираться, что пошло не так. Или быстро написать генератор тестов, запустить перебор и найти случайный тест, на котором решение не сработает.</p>
41 <p>Выбор конкретной модели поведения зависит от вида соревнований и ваших возможностей. На сложных и ответственных играх, таких как финал чемпионата мира, где даётся только одна попытка, чаще всего придерживаются консервативной тактики. Не нужно пытаться решить задачу в одиночку, рисковать и принимать опрометчивые решения.</p>
41 <p>Выбор конкретной модели поведения зависит от вида соревнований и ваших возможностей. На сложных и ответственных играх, таких как финал чемпионата мира, где даётся только одна попытка, чаще всего придерживаются консервативной тактики. Не нужно пытаться решить задачу в одиночку, рисковать и принимать опрометчивые решения.</p>
42 <p>Это зависит от соревнований.</p>
42 <p>Это зависит от соревнований.</p>
43 <p>Например, на Codeforces вводятся отдельные ограничения по времени для скриптовых языков, таких как Python. И если решение на C++ должно срабатывать не более чем за две секунды, то на Python - не более чем за пять. Поэтому на таких соревнованиях язык большой роли не играет.</p>
43 <p>Например, на Codeforces вводятся отдельные ограничения по времени для скриптовых языков, таких как Python. И если решение на C++ должно срабатывать не более чем за две секунды, то на Python - не более чем за пять. Поэтому на таких соревнованиях язык большой роли не играет.</p>
44 <p>На соревнованиях вроде ICPC или Topcoder Open картина немного иная. Набор языков там гораздо уже. Например, на ICPC это C++, Java, Python и, вы удивитесь, Ada. Никаких "поблажек" для скриптовых языков там нет: одинаковое ограничение по времени и для C++, и для Java, и для Python. Поэтому выбор языка здесь очень важен.</p>
44 <p>На соревнованиях вроде ICPC или Topcoder Open картина немного иная. Набор языков там гораздо уже. Например, на ICPC это C++, Java, Python и, вы удивитесь, Ada. Никаких "поблажек" для скриптовых языков там нет: одинаковое ограничение по времени и для C++, и для Java, и для Python. Поэтому выбор языка здесь очень важен.</p>
45 <p>Обычно выбирают между C++ и Java. При этом жюри гарантирует, что решение, которое укладывается в заданные ограничения, существует как для C++, так и для Java, которая по умолчанию более медленная. Но, положа руку на сердце, у команды с "плюсами" часто больше шансов пройти по времени: иной раз даже более-менее простые решения со сложностью О (n^2) укладываются в 1,95 секунды. И это, конечно, важное преимущество.</p>
45 <p>Обычно выбирают между C++ и Java. При этом жюри гарантирует, что решение, которое укладывается в заданные ограничения, существует как для C++, так и для Java, которая по умолчанию более медленная. Но, положа руку на сердце, у команды с "плюсами" часто больше шансов пройти по времени: иной раз даже более-менее простые решения со сложностью О (n^2) укладываются в 1,95 секунды. И это, конечно, важное преимущество.</p>
46 <p>Тогда почему некоторые всё-таки выбирают Java? Банально потому, что в Java легче отлавливать баги: чуть что - язык тут же расскажет и покажет, что и где пошло не так, и это намного приятнее, чем словить undefined behavior и полчаса его дебажить.</p>
46 <p>Тогда почему некоторые всё-таки выбирают Java? Банально потому, что в Java легче отлавливать баги: чуть что - язык тут же расскажет и покажет, что и где пошло не так, и это намного приятнее, чем словить undefined behavior и полчаса его дебажить.</p>
47 <p>Иногда мы влюбляемся в собственные идеи и долго не можем от них отказаться. В спортивном программировании это может стать большой проблемой. Подобно лудоманам, вы рискуете попасть в ловушку азарта и думать, будто, просидев за задачей ещё пять минут, уж точно найдёте решение. А часы продолжают предательски тикать, оставляя всё меньше времени на остальные задачи…</p>
47 <p>Иногда мы влюбляемся в собственные идеи и долго не можем от них отказаться. В спортивном программировании это может стать большой проблемой. Подобно лудоманам, вы рискуете попасть в ловушку азарта и думать, будто, просидев за задачей ещё пять минут, уж точно найдёте решение. А часы продолжают предательски тикать, оставляя всё меньше времени на остальные задачи…</p>
48 <p>Принять решение помогает таблица результатов, в которой видно, сколько команд решили ту или иную задачу. Если вы бьётесь над как бы очевидной задачей, которую "вот-вот решите", а все команды ловят за неё прочерки, то это явный сигнал, что надо бросать.</p>
48 <p>Принять решение помогает таблица результатов, в которой видно, сколько команд решили ту или иную задачу. Если вы бьётесь над как бы очевидной задачей, которую "вот-вот решите", а все команды ловят за неё прочерки, то это явный сигнал, что надо бросать.</p>
49 <p>Гораздо сложнее, когда все задачу сдают, а вы нет. В таком случае полезно отложить её на время, например на час, и переключиться на что-то другое. Или устроить перезагрузку: отбросить всё, что нарешали, и начать сначала. Также иногда помогает "брутфорс" с помощью генератора случайных тестов, о котором я писал выше.</p>
49 <p>Гораздо сложнее, когда все задачу сдают, а вы нет. В таком случае полезно отложить её на время, например на час, и переключиться на что-то другое. Или устроить перезагрузку: отбросить всё, что нарешали, и начать сначала. Также иногда помогает "брутфорс" с помощью генератора случайных тестов, о котором я писал выше.</p>
50 <p>Умение вовремя остановиться полезно и в промышленной разработке. Увлеченные программисты в поисках бага способны просидеть сутки перед монитором, хотя часто бросить и смириться с тем, что сегодня "не идёт", бывает куда эффективнее. Вполне вероятно, что уже на следующий день, когда вы вернётесь к коду, отдохнув и сбросив контекст, неуловимый баг отыщется в считаные минуты.</p>
50 <p>Умение вовремя остановиться полезно и в промышленной разработке. Увлеченные программисты в поисках бага способны просидеть сутки перед монитором, хотя часто бросить и смириться с тем, что сегодня "не идёт", бывает куда эффективнее. Вполне вероятно, что уже на следующий день, когда вы вернётесь к коду, отдохнув и сбросив контекст, неуловимый баг отыщется в считаные минуты.</p>
51 <p>Нерешаемые или очень сложные задачи в спортивном программировании в шутку называют "гробами". Важно как можно раньше их распознать, чтобы отложить напоследок или вовсе отбросить и не тратить время впустую. Здесь хорошо помогает опыт, интуиция и наблюдение за другими участниками: если никто задачу не сдаёт, значит, скорее всего, это "гроб".</p>
51 <p>Нерешаемые или очень сложные задачи в спортивном программировании в шутку называют "гробами". Важно как можно раньше их распознать, чтобы отложить напоследок или вовсе отбросить и не тратить время впустую. Здесь хорошо помогает опыт, интуиция и наблюдение за другими участниками: если никто задачу не сдаёт, значит, скорее всего, это "гроб".</p>
52 <p>С другой стороны, далеко не всегда стоит следовать за толпой - даже если это толпа программистов-олимпиадников. Бывает, что несколько команд не могут сдать задачу просто потому, что что-то упустили, а остальные пугаются и отбрасывают её. Потом эта же задача встречается на локальном соревновании, какая-нибудь команда её решает в первый час, и за ней находят решение другие. Мнение толпы иногда сильно влияет на результат.</p>
52 <p>С другой стороны, далеко не всегда стоит следовать за толпой - даже если это толпа программистов-олимпиадников. Бывает, что несколько команд не могут сдать задачу просто потому, что что-то упустили, а остальные пугаются и отбрасывают её. Потом эта же задача встречается на локальном соревновании, какая-нибудь команда её решает в первый час, и за ней находят решение другие. Мнение толпы иногда сильно влияет на результат.</p>
53 <p>Один из примеров "гробов" - геометрия, в частности с трёхмерным пространством, с математическими моделями, подход к которым непонятен.</p>
53 <p>Один из примеров "гробов" - геометрия, в частности с трёхмерным пространством, с математическими моделями, подход к которым непонятен.</p>
54 <p>Решать, решать и ещё раз решать! Чем больше задач разберёте, тем выше вероятность, что на соревнованиях попадётся что-то знакомое или даже аналогичное ("баян", другими словами). Мы использовали архивы уральского чемпионата на <a>acm.timus.ru</a>. К концу олимпиадной карьеры у всех в личном зачёте было примерно по тысяче задач.</p>
54 <p>Решать, решать и ещё раз решать! Чем больше задач разберёте, тем выше вероятность, что на соревнованиях попадётся что-то знакомое или даже аналогичное ("баян", другими словами). Мы использовали архивы уральского чемпионата на <a>acm.timus.ru</a>. К концу олимпиадной карьеры у всех в личном зачёте было примерно по тысяче задач.</p>
55 <p>Но решать задачи в "тепличных условиях" - это всё равно что готовиться к чемпионату мира по футболу, играя только с товарищами по команде. Нужно постоянно мериться силами с соперниками, чтобы понимать свой реальный уровень подготовки. Для этого есть несколько инструментов.</p>
55 <p>Но решать задачи в "тепличных условиях" - это всё равно что готовиться к чемпионату мира по футболу, играя только с товарищами по команде. Нужно постоянно мериться силами с соперниками, чтобы понимать свой реальный уровень подготовки. Для этого есть несколько инструментов.</p>
56 <p><strong>Виртуальные соревнования.</strong>Всё, чему вы научились на первом этапе, нужно отработать в стрессовых условиях ограниченного времени. Для этого на площадках вроде Codeforces и Opentrains есть виртуальный режим, который позволяет участвовать в соревновании так, будто с вами в реальном времени соревнуются другие команды. Результаты отображаются в таблице, и исход игры заранее неизвестен.</p>
56 <p><strong>Виртуальные соревнования.</strong>Всё, чему вы научились на первом этапе, нужно отработать в стрессовых условиях ограниченного времени. Для этого на площадках вроде Codeforces и Opentrains есть виртуальный режим, который позволяет участвовать в соревновании так, будто с вами в реальном времени соревнуются другие команды. Результаты отображаются в таблице, и исход игры заранее неизвестен.</p>
57 <p>Во время активной подготовки мы играли в таком режиме два-три раза в неделю. Далее приступали к разбору нерешённых задач: изучали решение на сайте и попутно необходимую теорию. Всё это занимало более 30 часов в неделю, как настоящая работа на фултайме.</p>
57 <p>Во время активной подготовки мы играли в таком режиме два-три раза в неделю. Далее приступали к разбору нерешённых задач: изучали решение на сайте и попутно необходимую теорию. Всё это занимало более 30 часов в неделю, как настоящая работа на фултайме.</p>
58 <p><strong>Загородные сборы.</strong>Это отличная возможность помериться силами с реальными соперниками и порешать задачи, которых ещё ни разу не было на соревнованиях. Сборы проводятся в Москве, Петрозаводске, Ижевске и <a>других городах</a>и длятся одну-две недели.</p>
58 <p><strong>Загородные сборы.</strong>Это отличная возможность помериться силами с реальными соперниками и порешать задачи, которых ещё ни разу не было на соревнованиях. Сборы проводятся в Москве, Петрозаводске, Ижевске и <a>других городах</a>и длятся одну-две недели.</p>
59 <p><strong>Локальные соревнования.</strong>Участвуйте в местных чемпионатах, которые проходят в Екатеринбурге, Новосибирске, Москве, Санкт-Петербурге и других региональных центрах России. Регулярное участие повышает стрессоустойчивость и адаптивность к смене локаций и позволяет подходить к более глобальным соревнованиям, таким как финал ICPC, менее восприимчивым к раздражителям, которых там в изобилии.</p>
59 <p><strong>Локальные соревнования.</strong>Участвуйте в местных чемпионатах, которые проходят в Екатеринбурге, Новосибирске, Москве, Санкт-Петербурге и других региональных центрах России. Регулярное участие повышает стрессоустойчивость и адаптивность к смене локаций и позволяет подходить к более глобальным соревнованиям, таким как финал ICPC, менее восприимчивым к раздражителям, которых там в изобилии.</p>
60 <p>?<strong>Советы от профи</strong></p>
60 <p>?<strong>Советы от профи</strong></p>
61 <p>Найти советы по подготовке можно на <a>Codeforces</a> - это одна из крупнейших мировых площадок по спортивному программированию. Помимо контестов и отдельных задач, там есть блоги, в которых участники сообщества публикуют советы. Можно найти десять самых залайканных постов и выбрать подходящую стратегию. Если человек входит в мировой топ-100 или топ-200, то, скорее всего, знает, о чём говорит.</p>
61 <p>Найти советы по подготовке можно на <a>Codeforces</a> - это одна из крупнейших мировых площадок по спортивному программированию. Помимо контестов и отдельных задач, там есть блоги, в которых участники сообщества публикуют советы. Можно найти десять самых залайканных постов и выбрать подходящую стратегию. Если человек входит в мировой топ-100 или топ-200, то, скорее всего, знает, о чём говорит.</p>
62 <p>Я бы рекомендовал отталкиваться от задач: сначала попытаться что-то решить, а потом изучить соответствующую теорию. Не существует волшебной книги, по которой можно подготовиться, как готовятся к экзамену в университете.</p>
62 <p>Я бы рекомендовал отталкиваться от задач: сначала попытаться что-то решить, а потом изучить соответствующую теорию. Не существует волшебной книги, по которой можно подготовиться, как готовятся к экзамену в университете.</p>
63 <p>Спортивное программирование развивает навык решать алгоритмические задачи любой сложности. Многие задачи перестают казаться хоть сколько-нибудь сложными, и это даёт вам преимущество на технических интервью, особенно в крупных IT-компаниях, где алгоритмам уделяется много внимания.</p>
63 <p>Спортивное программирование развивает навык решать алгоритмические задачи любой сложности. Многие задачи перестают казаться хоть сколько-нибудь сложными, и это даёт вам преимущество на технических интервью, особенно в крупных IT-компаниях, где алгоритмам уделяется много внимания.</p>
64 <p>Когда я проходил собеседование в "Яндексе", алгоритмическая часть прошла очень легко. Более того, я умудрился отравиться перед вторым этапом, но всё же решил не переносить его… Думаю, что даже в таком моем состоянии интервьюер быстро понял, что я легко справляюсь с алгоритмическими задачами.</p>
64 <p>Когда я проходил собеседование в "Яндексе", алгоритмическая часть прошла очень легко. Более того, я умудрился отравиться перед вторым этапом, но всё же решил не переносить его… Думаю, что даже в таком моем состоянии интервьюер быстро понял, что я легко справляюсь с алгоритмическими задачами.</p>
65 <p>Есть и менее очевидные вещи, которые также важны.</p>
65 <p>Есть и менее очевидные вещи, которые также важны.</p>
66 <p>✅ Во-первых, на соревнованиях прививается "алгоритмический подход" к решению задач:</p>
66 <p>✅ Во-первых, на соревнованиях прививается "алгоритмический подход" к решению задач:</p>
67 <ul><li>сформулировать задачу,</li>
67 <ul><li>сформулировать задачу,</li>
68 <li>понять её;</li>
68 <li>понять её;</li>
69 <li>определить "корнер-кейсы" и ограничения;</li>
69 <li>определить "корнер-кейсы" и ограничения;</li>
70 <li>расписать решение в общем виде.</li>
70 <li>расписать решение в общем виде.</li>
71 </ul><p>Другими словами, это способ решать задачи без паники и распыления фокуса. К нему довольно быстро привыкаешь - и начинаешь использовать даже в процессе проектирования крупных систем.</p>
71 </ul><p>Другими словами, это способ решать задачи без паники и распыления фокуса. К нему довольно быстро привыкаешь - и начинаешь использовать даже в процессе проектирования крупных систем.</p>
72 <p>✅ Во-вторых, спортивное программирование прокачивает навык работы в стрессовых ситуациях, когда нет права на ошибку.</p>
72 <p>✅ Во-вторых, спортивное программирование прокачивает навык работы в стрессовых ситуациях, когда нет права на ошибку.</p>
73 <p>Мне это пригодилось на on-call-дежурствах, когда случались неожиданные всплески трафика или череда "четырёхсотых" ответов. Нам известно лишь, что мы падаем, и ещё какие-то симптомы. Времени на тестовый запуск кода и отладку нет, на руках только снапшот кода, который полчаса будет собирать нужный бинарник, а сервис падает прямо сейчас.</p>
73 <p>Мне это пригодилось на on-call-дежурствах, когда случались неожиданные всплески трафика или череда "четырёхсотых" ответов. Нам известно лишь, что мы падаем, и ещё какие-то симптомы. Времени на тестовый запуск кода и отладку нет, на руках только снапшот кода, который полчаса будет собирать нужный бинарник, а сервис падает прямо сейчас.</p>
74 <p>Стандартная ситуация на олимпиаде: до окончания 15 минут, при одном из тестов программа выдаёт неверный результат, и в таком стрессе, под огромным давлением нужно успокоиться и сконцентрироваться. С опытом учишься отбрасывать эмоции и продолжать думать ровно до тех пор, пока соревнование не закончится.</p>
74 <p>Стандартная ситуация на олимпиаде: до окончания 15 минут, при одном из тестов программа выдаёт неверный результат, и в таком стрессе, под огромным давлением нужно успокоиться и сконцентрироваться. С опытом учишься отбрасывать эмоции и продолжать думать ровно до тех пор, пока соревнование не закончится.</p>
75 <p>✅ В-третьих, соревнования учат работать в команде со сложными, но талантливыми людьми. Особенно это касается серьёзных соревнований, когда вы попадаете в топ-100 в мире или в топ-10 по России в командном зачёте. На этом уровне остаются очень талантливые ребята, у которых высокое (что справедливо) мнение о себе. Эти люди способны решить практически любую техническую задачу, хоть и не все обладают сильными софт-скиллами.</p>
75 <p>✅ В-третьих, соревнования учат работать в команде со сложными, но талантливыми людьми. Особенно это касается серьёзных соревнований, когда вы попадаете в топ-100 в мире или в топ-10 по России в командном зачёте. На этом уровне остаются очень талантливые ребята, у которых высокое (что справедливо) мнение о себе. Эти люди способны решить практически любую техническую задачу, хоть и не все обладают сильными софт-скиллами.</p>
76 <p>Теперь о недостатках. Их почти нет.</p>
76 <p>Теперь о недостатках. Их почти нет.</p>
77 <p><strong>❌ Низкое качество кода.</strong>Нужно признать, что с точки зрения продакшена качество олимпиадного кода оставляет желать лучшего. С другой стороны, олимпиадные программы и не нужно поддерживать.</p>
77 <p><strong>❌ Низкое качество кода.</strong>Нужно признать, что с точки зрения продакшена качество олимпиадного кода оставляет желать лучшего. С другой стороны, олимпиадные программы и не нужно поддерживать.</p>
78 <p>Код - это инструмент, с помощью которого люди решают задачи. Если вы разрабатываете сервис, над которым работают десятки и сотни инженеров, то да, качество выходит на первый план. Но на олимпиаде, в условиях ограниченного времени, когда нужно решить 8-12 задач за пять часов, важно лишь получить работающее решение (иногда это актуально и в профессиональной разработке).</p>
78 <p>Код - это инструмент, с помощью которого люди решают задачи. Если вы разрабатываете сервис, над которым работают десятки и сотни инженеров, то да, качество выходит на первый план. Но на олимпиаде, в условиях ограниченного времени, когда нужно решить 8-12 задач за пять часов, важно лишь получить работающее решение (иногда это актуально и в профессиональной разработке).</p>
79 <p>Я нанимал много ребят с олимпиадным прошлым и могу точно сказать: если понятно и аргументированно объяснить джуну, почему надо соблюдать код-стайл, проблем не возникнет. В то же время умение быстро написать работающий "одноразовый" код для проверки гипотезы высоко ценится.</p>
79 <p>Я нанимал много ребят с олимпиадным прошлым и могу точно сказать: если понятно и аргументированно объяснить джуну, почему надо соблюдать код-стайл, проблем не возникнет. В то же время умение быстро написать работающий "одноразовый" код для проверки гипотезы высоко ценится.</p>
80 <p><strong>❌ Игра (не) стоит свеч.</strong>Многие плюсы, которые я перечислил выше, появляются, когда вы добрались до топ-100 - топ-200 в мировом командном зачёте. Но вот вопрос: а зачем стремиться дальше и выше? Зачем пытаться занять пьедестал?</p>
80 <p><strong>❌ Игра (не) стоит свеч.</strong>Многие плюсы, которые я перечислил выше, появляются, когда вы добрались до топ-100 - топ-200 в мировом командном зачёте. Но вот вопрос: а зачем стремиться дальше и выше? Зачем пытаться занять пьедестал?</p>
81 <p>Кажется, что, кроме подпитки ЧСВ и нескольких тысяч долларов, это не даёт практически ничего. Зато у среднего олимпиадника, который, помимо алгоритмов, силён в смежных дисциплинах, в том же ML, куда больше карьерных возможностей.</p>
81 <p>Кажется, что, кроме подпитки ЧСВ и нескольких тысяч долларов, это не даёт практически ничего. Зато у среднего олимпиадника, который, помимо алгоритмов, силён в смежных дисциплинах, в том же ML, куда больше карьерных возможностей.</p>
82 <p>Сейчас я думаю, что занятия спортивным программированием не прошли даром, хоть когда-то и разочаровался в нём. Ещё в начале карьеры в "Яндексе" я задумался о том, что, помимо алгоритмов, надо было заниматься ещё чем-то, уделять больше времени университету и изучению технологий…</p>
82 <p>Сейчас я думаю, что занятия спортивным программированием не прошли даром, хоть когда-то и разочаровался в нём. Ещё в начале карьеры в "Яндексе" я задумался о том, что, помимо алгоритмов, надо было заниматься ещё чем-то, уделять больше времени университету и изучению технологий…</p>
83 <p>Но какое-то время спустя я всё же пришёл к выводу, что опыт попадания в топ придал мне уверенности в том, что я могу решить почти любую задачу. На чемпионате мира я конкурировал с сильнейшими программистами из разных стран, сразился с ними в честной борьбе, где решают не деньги и связи, а интеллект. Эта уверенность определённо стоила пяти лет активных занятий спортивным программированием.</p>
83 <p>Но какое-то время спустя я всё же пришёл к выводу, что опыт попадания в топ придал мне уверенности в том, что я могу решить почти любую задачу. На чемпионате мира я конкурировал с сильнейшими программистами из разных стран, сразился с ними в честной борьбе, где решают не деньги и связи, а интеллект. Эта уверенность определённо стоила пяти лет активных занятий спортивным программированием.</p>
84 <p>Пожалуй, самая крупная звезда - белорусский программист<a>Геннадий Короткевич</a>(выступает под ником tourist). В 2020 году он занимал первое место в рейтингах<a>Topcoder</a>и <a>Codeforces</a>.</p>
84 <p>Пожалуй, самая крупная звезда - белорусский программист<a>Геннадий Короткевич</a>(выступает под ником tourist). В 2020 году он занимал первое место в рейтингах<a>Topcoder</a>и <a>Codeforces</a>.</p>
85 <p>Ещё одна знаменитость -<a>Пётр Митричев</a>. Он также одержал победу в невообразимом количестве соревнований.</p>
85 <p>Ещё одна знаменитость -<a>Пётр Митричев</a>. Он также одержал победу в невообразимом количестве соревнований.</p>
86 <p>Среди стран, если считать по общему количеству побед в индивидуальных, студенческих и школьных соревнованиях, лидируют Польша, Россия, Беларусь, Китай, Япония и США. Особенно в последнее время выросла российская команда: за 15 лет мы выиграли около 10 мировых чемпионатов.</p>
86 <p>Среди стран, если считать по общему количеству побед в индивидуальных, студенческих и школьных соревнованиях, лидируют Польша, Россия, Беларусь, Китай, Япония и США. Особенно в последнее время выросла российская команда: за 15 лет мы выиграли около 10 мировых чемпионатов.</p>
87 <p>В этой статье мы обсудили классическое спортивное программирование, но прогресс не стоит на месте и понятие "классика" весьма эфемерно. Организаторы чемпионатов следят за трендами и постоянно экспериментируют с направлениями и форматами.</p>
87 <p>В этой статье мы обсудили классическое спортивное программирование, но прогресс не стоит на месте и понятие "классика" весьма эфемерно. Организаторы чемпионатов следят за трендами и постоянно экспериментируют с направлениями и форматами.</p>
88 <p>Выше я уже упомянул оптимизационные задачи, приближенные к тем, что каждый день решают инженеры в BigTech-компаниях вроде "Яндекса", Amazon и Netflix. Недавно Google устраивал соревнования по программированию распределённых систем, задачи на которых по условиям напоминают реальные. И конечно, куда без соревнований по машинному обучению, которые уже регулярно проводятся в разных странах.</p>
88 <p>Выше я уже упомянул оптимизационные задачи, приближенные к тем, что каждый день решают инженеры в BigTech-компаниях вроде "Яндекса", Amazon и Netflix. Недавно Google устраивал соревнования по программированию распределённых систем, задачи на которых по условиям напоминают реальные. И конечно, куда без соревнований по машинному обучению, которые уже регулярно проводятся в разных странах.</p>
89 <p>Уверен, через 5-10 лет спортивное программирование изменится до неузнаваемости. Может быть, промпт-инжиниринг станет одной из флагманских дисциплин и мы напишем новую статью о "классическом" спортивном программировании.</p>
89 <p>Уверен, через 5-10 лет спортивное программирование изменится до неузнаваемости. Может быть, промпт-инжиниринг станет одной из флагманских дисциплин и мы напишем новую статью о "классическом" спортивном программировании.</p>
90 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
90 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>