Дорогое сообщество codeforces. Я 8 лет как не в рейтинге и 7 лет как ничего не послылал в систему. И вот однажды на днях меня резко переклинило и во мне проснулся фанат теории алгоритмов спустя 7 лет сна.
Вчера мне в голову пришла странная идея. А что если разработать алгоритм прокачки человека с новичка до топ 10 на codeforces.
И тут сразу пришли следующие соображения.
- Если человек не одарен талантом (гениальностью) его физический предел это 2450 (слабый гроссмейстер). Можно сколько угодно быть натренированным знасть высшую математику всю. Ну нет в человеке творческой нотки и все.
- Если вам кажется что вы гений — поздравляю вы неограничены ничем.
- С чего начинать (какие темы и сложность задач)
Если с темами все понятно — уже изъезженный вопрос, то вот второе — куда более интереснее. Я так понимаю что сложность задач в архиве — это значение почти минимального рейтинга человека решившего его на раунде где была эта задача (я проверял эту гипотезу просматривая результаты всех подряд раундов). Тогда алгоритм прокачки предельно прост
А. С помощью дихотомии по ответу находим границы сложностей задач. Нижняя граница — это самая простая задача которая заставляет сильно думать но не более 20 минут в среднем (но не халявка поэтому именно подумать надо) Например, у меня где-то 2000 вышло. Верхняя граница — это самая сложная задача которая вам поддалась с огромными усилиями вы без помощи смогли ее решить пусть даже это будет единичный случай. Например, у меня где-то 2500 вышло.
Б. Решаем задачи из этого диапазона сложностей потихоньку повышая сложность когда начинаете чувствувовать что способны на большее.
В. А как решать то? Я так понимаю что решение всех задач делятся на 2 этапа 1 — это построение алгоритма решения 2 — это реализация этого алгоритма с решением возможных технических моментов. А что делать если не получается? Тут длинная схема.
- Если придумали кучу алгоритмов решения (бывает и такое) кодируйте все их подряд по не получите полное решение не думая, натренируетесь на реализации покрайней мере новичкам и даже продвинутым будет очень полезно (вдруг вы структуры новые данных для себе открыли или новую тему осваиваете — вот потренируетесь).
- Но что если алгоритмы иссякли а полного решения нет? Тогда смотрим тесты только у которых написано "Неправильный ответ" (да, у некоторых читалей уже сгорело, предполагаю от этой строчки). Объясняю зачем — как понять что алгоритм неверен или баг в коде? Для экономии времени это лучший способ. Смотрите тест — большой — значит мелкий косяк в алгоритме (именно мелкий) или баг (что скорее всего). Если маленький — то в ручную своим алгоритмом посчитайте (как правило на маленьких и падает решение) Если ответ сошелся — баг если нет — алгоритм в корне не верен думайте дальше. Если баг — тогда САМИ (отмечу что сами) придумываете случаи когда программа работает не так как задумано (алгоритм), а не дебажить на том тесте что упало а то не научитесь искать ошибки в коде. Еще стоит обратить внимание на "ошибка во время исполнения или компиляции" — это точно баг в коде тест точно смотреть не надо.
- Читать разбор задач или нет? Мой ответ — однозначно нет. Он нужен лишь в двух случаях. Сравнить свое полное решение с авторским чтобы понять что вы решали нормально (ну или автор намудрил а вы решили проще). Второй случай — когда вы прошли кучу тестов и где-то далеко решение падает на "неправильный ответ" Тогда скорее всего у вас мелкий изъян в алгоритме (один раз только помню чтобы в корне неверное решение прошло все тесты кроме последнего помню был скандал на codeforces что претесты кривые но это очень большая редкость — исключение). Вот тогда возможно либо стоит подумать самим что не так или не мучать себя и почитать разбор — ну тут уже на ваше усмотрение. Интересно мнение сообщества по поводу такого алгортима подготовки до абсолютно любого уровня с любого уровня. P.S. Добавил абзацы а то тяжело читается.