Чему научитесь
- Отличать рост от накопления решённых задач
- Составить себе план на ближайшие три месяца
- Понимать признаки застоя и что с ними делать
Как устроено занятие
Сначала разбор с примерами и короткими проверками понимания — они нужны, чтобы поймать непонятое сразу, а не через три темы.
Дальше 8 задач лестницей: разминка, основа, со звёздочкой. Занятие засчитывается, когда решено 5 — остальные не пропадают и учитываются отдельно.
Сколько это займёт
Примерно час-полтора вместе с задачами. Сроков нет: можно закрыть вкладку и вернуться когда удобно — прогресс сохранится.
Расту ли я или просто решаю задачи
Решённые задачи — плохая мера прогресса. Можно решить триста задач одного типа и остаться на том же уровне: каждая следующая не требует нового.
Рост — это когда растёт набор приёмов, которые вы применяете самостоятельно, и скорость, с которой вы доводите идею до принятого решения.
Три признака, что рост есть
- Вы решаете задачи, которые месяц назад не понимали. Не «сложнее», а именно непонятные раньше.
- Сокращается путь от идеи до кода. Раньше час, теперь двадцать минут — при том же классе задач.
- Вы сами находите ошибку. Не по вердикту «неверный ответ», а по собственной проверке крайних случаев.
Три признака застоя
- Вы решаете только то, что получается. Комфортно, но бесполезно.
- Вы читаете разборы, но не пишете код. Понимание без набора не переносится на контест.
- Вердикт стал способом отладки. Отправили, посмотрели, поправили наугад, снова отправили.
Чек-лист: что должно быть закрыто на каждом уровне
Отметьте честно. Закрыто — значит вы решите задачу на эту тему без подсказки и без разбора.
База
- Читаю ввод любого формата, не путаю строку и число
- Пишу цикл
whileс правильным условием выхода с первого раза - Режу и собираю строки, знаю их неизменяемость
- Перебираю список с условием, нахожу максимум и его позицию
- Пишу рекурсию с базой и понимаю, где она развернётся в дерево
- Отличаю , и и знаю, что пройдёт при
- Применяю префиксные суммы, два указателя и решето
Продвинутый
- Сортирую по компаратору и понимаю, зачем нужна устойчивость
- Вижу, когда перебор пар сводится к двум указателям или окну
- Доказываю жадность обменом, а не примерами
- Проверяю монотонность до применения двоичного поиска по ответу
- Пишу обход графа итеративно и не боюсь глубины
- Считаю кратчайшие пути: Дейкстра, Флойд, 0-1 BFS
- Пишу динамику по таблице и рюкзаки, вижу состояние и переход
- Работаю с масками и подмножествами
Профи
- Свожу граф к конденсации и считаю динамику по DAG
- Выбираю между префикс-функцией, Z-функцией, бором и хешами осознанно
- Пишу дерево отрезков с обновлением на отрезке
- Пишу динамику по подотрезкам и по маскам
- По ограничениям задачи называю нужную сложность до написания кода
- Проверяю переполнение и крайние случаи до отправки, а не после
Как тренироваться, чтобы расти
Работающий режим выглядит так.
| что | как часто | зачем |
|---|---|---|
| контест на время | раз в неделю | учит решать под давлением и распределять время |
| дорешивание | сразу после контеста | там, где вы уже думали, разбор усваивается лучше всего |
| разбор чужих решений | после дорешивания | показывает короткие пути, до которых вы не додумались |
| новая тема | раз в одну-две недели | расширяет набор приёмов |
| задачи на границе | каждый день по одной | «на границе» — та, где вы не уверены, что решите |
Правило одного часа
Если задача не поддалась за час — открывайте разбор. Сидеть над ней три часа кажется упорством, но обычно это способ не узнать приём, которого вы не знаете.
После разбора обязательно напишите решение сами, не копируя. Понял и написал — разные умения, а на олимпиаде нужно второе.
Правило трёх задач
Новый приём закрепляется не одной задачей, а тремя подряд на разных сюжетах. После третьей вы начинаете видеть приём в условии, а не вспоминать его.